-
创建版本库
git init
-
首次提交
git add 1.txt 2.txt git commit -m "first commit"
-
检查状态
git status git diff 1.txt
-
删除
git rm 2.txt
-
显示历史
git log git log --graph git log -n 3 # only the last three commits git log --oneline #only one line per commit git log --stat #only show statistics
-
push
1.先pull再push 2.指定目标版本库的路径及其分支 git push /projects/***.git master
-
撤出暂存区
git reset HEAD 1.txt
-
忽略
-
.gitignore文件
demo/会忽略所有包含demo的路径,比如/src/demo/sss
/demo/就只会忽略确定的路径
在子目录下创建.gitignore文件,就只会影响该目录下的
-
* 如果某个文件已经修改过之后,再在.gitignore中写进这个文件,仍然会被提交。**解决:**使用 update-index命令的--assume-unchanged选项
* 忽略某个文件
git update-index --assume-unchanged foo.txt
停止忽略:
git update-index --really-refresh
-
储藏
先不提交之前的修改,将修改保存在本地。
git stash
查看
git stash list
恢复
git stash pop
分支
-
查看
git branch git branch -a #所有
-
切换
git checkout branch1 git checkout -b branch2 #创建并切换
-
切换前存在未提交的修改
git commit --all git checkout branch2 或者放弃修改强制提交 git checkout --force branch2 或者储存修改再切换 git stash git checkout branch2
-
-
创建分支
-
为当前提交创建分支
git branch branch2
-
为任意一批提交创建分支
git branch branch3 78788b2c
-
从现有分支创建分支
git branch new-branch old-branch
-
-
重置分支
git reset --hard 39ea21a
-
删除分支
-
删除已经被终止的分支
git branch -d branch1
-
删除一个打开的分支,强制删除
git branch -D branch2
-
-
恢复删除
-
散列值恢复
git branch branch1 7232jjj
-
不知道散列值
git reflog #查看散列再恢复
-
-
合并分支
git merge branch1
-
取消合并
git reset --merge
-
快进合并
优点:简化版本库的历史记录;
缺点:不能根据已经合并的历史记录看过去发展;
优化:
git merge --no-ff branch1
-
-
冲突
-
冲突标志
<<<<HEAD与======之间为当前分支内容
======与>>>>>branch1之间为另一分支内容
-
显示共同祖辈,3路显示格式
git config merge.conflictstyle diff3
|||||与======之间是祖辈内容
-
解决冲突
-
编辑受影响的文件;
或者
采用--ours或--theirs 选项,只采用自己的或者别人的
git checkout --theirs file1/
-
注册修改
git add .
-
提交
git commit
-
log
-
只查看来自分支b,而不是来自a的
git log a..b git log --graph --oneline --decorate a b
-
-
-
变基
git rebase master
-
交换
-
clone
-
查看本地和远程版本库不同
git diff feature-a clone/feature-a
-
查看远程版本库的新增提交
git log --oneline feature-a..clone/feature-a
-
将远程版本库的签出到本地
git checkout -b feature-b clone/feature-b 或者 git fetch clone clone/feature-b:my-feature-b
-
-
获取数据
- fetch
- pull=fetch+merge
-
显示源版本库
git remote --verbose
-
-
标签
-
创建标签推送
git tag 1.2.3.4 master -m "demo tag" git push origin 1.2.3.4
-
-
子模块与子树
区别:带子模块的主版本库只能发布模块版本库;而模块版本库的内容带有子树的话,该模块版本库就被导入了主版本库中。
-
嵌入子模块
-
链接目录,绝对路径
git submodule add /global-path-to/sub sub
-
在config文件注册子模块
git submodule init
-
选择版本
cd sub git checkout v1.0
-
将.gitmodules文件和子目录添加并提交
cd .. git add .gitmodules git add sub git commit -m "submodule added"
-
-
克隆带子模块的项目
git submodule init git submodule update
-
更新子模块
cd sub git fetch git checkout v2.0 cd .. git add sub git commit -m "new versio of sub module"
-
子模块修改提交
cd sub git add sub1.txt git commit -m "change sub module" git push #提交病推送主版本的修改 cd .. git add main1.txt git add sub git commit -m "new version of submodule" git push
-
子树
-
嵌入子树
git subtree add --prefix=sub /global-path-to/sub v2.0 #若历史记录与主版本库无关,可以: git subtree add --squash --prefix=sub /global-path-to/sub master
-
更新子树
git subtree pull --prefix=sub /global-path-to/sub v2.1
-
垃圾回收
- gc
- 默认两星期
-
中央版本库
-
空目录纳入管理
在文件夹中创建.gitignore文件即可
-
行尾中止符设置
git config --global core.autocrlf input 还有false和true两种参数
-
共享版本库
- Git daemon搭建
- HTTp协议共享版本库
- SSH协议共享版本库
-
-
基于特性分支的开发
-
创建特性分支
-
更新master分支
git checkout master git pull --ff-only #--ff-only参数表示只允许进行快进式合并,如果存在一些本地修改,该合并就会被取消
-
创建特性分支
git checkout -b feature
-
(可选)在中央版本库维护特性分支
git push --set-upstream origin feature-a #--set-upstream参数将本地的特性分支与远程版本库中的分支连接起来,在pull和push中都可以省去origin
-
-
在master集成某一特性
-
更新master分支
git checkout master git pull --ff-only
-
合并特性分支
git merge feature-a --no-ff --no-commit
--no-ff参数防止快进式合并;
--no-commit用于指示git,不要因为接下来可能失败的测试而停止任何提交。 -
做一下回归测试,并为其创建一次提交
-
如果测试引发了错误,就reset丢弃当前执行的合并
git reset --hard HEAD
然后纠正错误,再从第1步走一遍;
-
-
-
然后提交
git commit -m "Delivering feature-a"
4. 将master分支传递至中央版本库
git push
* 如果在这个过程中,master分支上有其他特性分支集成进来,可能就会出现冲突;
git reset --hard ORIG_HEAD
git pull
然后再从**第1步**走一遍;
5. 删除或者继续使用特性分支
* 删除
git branch -d feature-a
git push origin :feature-a
*继续使用,并且将master分支的新修改传递到该分支
git checkout master
git pull --ff-only
git chekout feature-a
git merge --no-ff master
二分法排错
-
列出提交历史,找出起初正确的一个版本good,和最近出错的版本
git log --oneline
-
执行二分法查错
git bisect start 20202020 30303030 #第一个参数是bad提交,第二个是good
-
若给出的版本扔出错,则
git bisect bad 否则 git bisect good
直到提示找到错误第一次出现的地方为止
-
停止二分查找
git bisect reset
-
基于构建服务器的工作流
-
概述
last-build分支指向master分支最后构建成功的那个版本;
buildhistory分支会包含所有构建成功的版本。 -
过程
-
预备构建服务器
-
创建一个空版本库
mkdir buildrepo cd buildrepo git init
-
获取中央版本库master分支
git remote add -t master origin <central repo> #<central repo>表示链接到中央版本库的URL git fetch
-
创建build-history分支
#查看主分支的第一次提交 git log --oneline --first-parent origin/master | tail -1 #3a05e26 init git checkout -b build-history 3a05e26
-
-
构建服务器上的git
-
获取中央版本库的修改
git fetch
-
检查是否有构建需要
git diff --shortstat --exit-code origin/master
-
清理工作区
git reset --hard HEAD
-
将修改纳入本地build-history分支
git merge --no-ff --no-commit origin/master
完成构建
-
提交
git commit -m "build 001"
-
标记最后一次被成功构建的版本
git branch --force last-build HEAD^2 git push --force origin last-build:last-build
-
-
-
-
发行版交付
-
概述
- 开发放在master分支;
- 发行版在stable分支;
- 稳定工作放在codefreeze分支;
- 补丁工作放在hotfix分支;
- codefreeze和hotfix分支只活动在项目的稳定阶段和排错阶段;
- 稳定阶段和排错阶段的修改最终会合并到master分支。
-
过程
-
创建stable分支
git log --oneline --first-parent | tail -1 #3a05e26 init git branch stable 3a05e26
-
创建发行版
-
创建codefreeze分支
git checkout -b codefreeze master
-
稳定codefreeze
git checkout master git merge codefreeze
-
创建发行版
// 先检查stable分支中是否有codefreeze中没有包含的,存在就重新合并,再测试
-
-
-
git log codefreeze..stable --oneline
不存在就:
git checkout stable
git merge codefreeze --no--ff -m "Release-2.0.0"
git tag -a release-2.0.0 -m "Release-2.0.0"
git branch -d codefreeze
* 更新master分支
git checkout master
git merge stable -m "Done release-2.0.0"
3. 创建补丁
* 创建hotfix分支并排错
git checkout -b hotfix-a1 stable
* 验证补丁被并行化创建的可能性,即查看属于stable分支但是不属于该hotfix分支的修改
git log hotfix-a1..stable --oneline
* 发布补丁
git checkout stable
git merge hotfix-a1 --no-ff -m "Hotfix-Release-2.0.1"
git tag -a release-2.0.1 -m "Hot...."
* 将补丁更新到其他分支
git checkout codefreeze
git merge stable -m "Hotfix 2.0.1"
git checkout master
git merge codefreeze -m "Hotfix 2.0.1"
-
其他可能会用到的命令
-
创建归档,导出不包含Git元数据的tar或zip
git archive HEAD --format=tar > archive.tar
-