克隆远程仓库:
git clone http://mgit-tm.rnd.zz.com/hap/screenrecorder -b Master_common_ct01
分支:
git branch //查看分支
git checkout dev //切换到dev分支
git checkout -b dev //创建并切换到dev分支,dev分支是基于创建时分支而新建的分支,这样创建时,可以修改,可以push,但是pull更新代码会有问题,需要关联远程仓库
git branch --set-upstream-to=origin/Master_common_ct01 dev //将dev分支关联到远程Master_common_ct01仓库,关联后可以使用git pull拉出代码
git checkout -b dev origin/Master_common_ct01 //创建并切换到dev分支,并将dev分支关联到远程Master_common_ct01仓库
git branch -d dev //删除dev分支
git branch -D dev //强制删除dev分支
提交:
git add
git add -A //添加所有修改文件
git commit -m“commit message” //提交修改信息
git push origin dev:refs/for/Master_common_ct01 //将dev修改commit推送到远程仓库
回滚:
git checkout -f //恢复本地所有未commit的修改。拉取分支代码,或者新建分支之后,做了一系列修改,全部都不想要,用此命令清理回退到刚同步代码或者刚拉出分支时的状态,只要是未commit的都会被清理。
git reset HEAD
git reset commitID //回退提交,即回退到未add之前,代码修改还在,tag点回退到指定commitID对应的位置,重新修改后再add、commit
git reset --hard commitID //回退修改,代码、add、commit信息全部回退到commitID时的状态,修改的代码全部被删除
存档:
git stash //存档当前的修改,如果是新增文件,需要先add再运行此命令进行存档,否则只能存修改的,新增的不会被存档
git stash save “save message” //save message 是保存时的标记信息
git stash list //查看存档文件列表
git stash pop //使用最近一次存档到当前代码
git stash pop stash@{0} //使用编号为0的存档到当前代码
git stash dorp stash@{0} //删除编号为0的存档
git clear //清空所有存档
注意:存档是放在公用区域,任意分支存档的,所有分支都可以使用,清理命令会清理所有的存档,慎用
追加提交:
git commit --amend
1.已经add,未commit:需要追加修改,直接add进行追加,完成后commit,push,只生成一个gerrit
2.已经add,commit,未push生成gerrit:修改后add,再git commit --amend,进行追加,再push,只生成一个gerrit
3.已经add,commit,已经push生成gerrit,本地分支保留上次提交时的状态:在本地分支上继续修改,修改后add,再git commit --amend,查看amend之后的提交信息,如果信息中没有自动同步之前的ChangeID的话,就将生成的gerrit的ChangeID粘贴到信息的末尾,保存。再push,原来的gerrit会更新,gerrit地址保持不变
4已经add,commit,push生成了gerrit,本地仓库已经删除或被污染(如又修改了一个大需求,只修改到一半):采用挑单方式追加提交,本地新建并同步该分支最新代码,在原gerrit网址Download中复制Cherry-Pick,本地分支中粘贴复制内容并执行Cherry-Pick实现将修改应用到当前分支,再进行追加修改,修改后add,再git commit --amend,如果信息中没有自动同步之前的ChangeID的话,就将生成的gerrit的ChangeID粘贴到信息的末尾,保存。再push,原来的gerrit会更新为新修改后内容。
注意:本地多次修改并分别commit提交,最后push,结果是每次的commit最终都会生成一个对应的gerrit,且gerrit之间相互关联,因为每次提交都有对应的提交信息;本地commit一次,之后再都使用amend追加提交,修改信息,最后push只会生成一个gerrit,因为amend并没有新建提交信息,而是修改历史信息。追加提交的关键点在于ChangeID,如果ChangeID是一样的,系统就认为是同一次提交,是追加提交,只会更新之前ChangeID对应的gerrit;如果ChangeID不一样,就是新的提交,生成新的gerrit
挑单:
Cherry-Pick //如dev中已经生成gerrit,现在需要挑单到dev2,在本地同步dev2最新代码,在原gerrit网址Download中复制Cherry-Pick,本地分支中粘贴复制内容并执行Cherry-Pick实现将修改应用到当前分支,再进行追加修改,修改后add,再git commit --amend,再push,原来的gerrit会更新为新修改后内容。在Cherry-Pick时,如果出现冲突,在代码中解冲突,冲突解完后再执行git cherry-pick --continue;再push,原来的gerrit会更新为新的修改。如果冲突太多,不想解了,采用git cherry-pick --abort中断,本地代码会回到执行执行Cherry-Pick之前的干净状态
同步远程仓库与修改提交:
1.本地未做修改,远程仓库有修改,git pull --rebase (不推荐使用git pull,容易生生菱形commit信息)
2.本地有修改,未add,使用git stash,存档本地修改,此时工作区干净,再使用git pull --rebase更新到最新代码;再git stash pop读取存档,解冲突,再上库
3.本地有修改,已add,已commit,未push生成gerrit,此时的工作区干净,使用git pull --rebase更新到最新代码,解冲突,git commit --amend追加提交信息,再push上库,生成一个gerrit
4.强制同步远程仓库,覆盖本地文件
git fetch --all //同步远程分支信息,但是代码不同步
git reset --hard origin/Master_common_ct01 //关键是这个,强行将head移到origin/Master_common_ct01的最新处,冲掉本地所有修改,git fetch --all之后运行此命令,所有信息同步至最新;如果不运行git fetch,只能同步至代码刚拉下来时对应的分支最新信息
gerrit冲突:
1.gerrit过期,或其他gerrit已经抢先合入,导致当前gerrit不是基于最新远程库,在网站上点击rebase,使gerrit基于最新远程仓库更新
2.rebase无效还是显示冲突时,采用追加提交法解冲突追加提交更新gerrit,参见追加提交第4条
commit的增删改查:
当我们commit之后,总会遇到各种各样的情况,比如commit的信息的修改,commit内容的修改等等
git rebase -i 之后,就进入互交模式,会在vi编辑器中列举出来还未push到远程服务器的所有提交,列举的顺序是和git log列表的顺序相反的,在这个互交模式下,我们可以进行很多的操作:
如:我们commit了三次,本地有三笔提交,都未push过,git rebase -i
pick 提交一
pick 提交二
pick 提交三
1.希望将提交二删除。直接在vi编辑器中删除提交二的commit信息保存退出即可。
2.希望将提交三和提交二调换顺序。直接在vi编辑器中调换commit的顺序,保存退出即可。
3.希望将提交二和提交一合并。将提交二的pick修改为f(或者fixup),保存退出,提交二会被合并到前一个提交也就是提交一里面,提交信息为提交一的信息;将pick改为s(或者squash),保存退出,提交二会被合并到前一个提交也就是提交一里面,但是提交信息是提交一和提交二信息加在一起的信息。
4.希望将提交三和提交一合并。可以先将提交二和提交三交换,然后将提交三合并到提交一。
5.希望修改提交二的提交信息、或者希望在提交二上追加提交、或者希望将提交二分割成两个提交、或者希望在提交二和提交三之间插入新的提交。将提交二前面的pick修改为e(edit),保存退出,注意此时的head点就移动到提交二的位置了,提交三被保存起来;此时直接修改提交就是在提交二和提交三中间插入的新提交;此时也可以用git commit --amend 进行追加提交信息;也可以修改后git commit --amend追加修改然后;可以git reset 提交一,将指针移动到提交一,然后分步commit多次,这样就把提交二分割了;这些提交完成后,运行git rebase --continue 修改就会生效。
其实运行git rebase -i 之后,就有很详细的说明:参照说明做即可
commands:
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash",but discard this commit's log message
d, drop = remove commit
These lines can be re-ordered; they are executed from top to bottom.
If you remove a line here THAT COMMIT WILL BE LOST.
However, if you remove everything, the rebase will be abort.
Note that empty commits are commented out