如何使用Git来保持树的整洁
多人协同完成项目时,同时从远程拉下最新的代码开发,在提交的时候会有优先顺序。由于是同时开发,当本地执行多个commit之后,其中一人push至远程之后,其他人如果要提交代码,必选先commit本地代码,然后才能fetch和merge或者pull将远程最新代码拉下来合并提交。 这样一来,多次操作之后,代码的版本树会交错在一起非常混乱,看起来不是很舒服。 那么如果解决这样的问题呢?有以下几种方法:
多人在同一分支(dev)操作
先执行fetch命令,查看远程是否有更新。
如果没有更新,可以直接执行push操作。
git fetch
git push -u origin dev
如果有更新并且本地没有执行过commit,同样的步骤,先拉取远程代码查看是否有其他更新。
git fetch
执行以上命令,会有类似以下内容输出:
remote: Counting objects: 1, done.
remote: Total 1 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (1/1), done.
From http://xxx.git
cad92b6..611b8cc dev -> origin/dev
然后再执行stach命令,将最近一次commit之后修改的内容提取出来放到Git栈中,如果目录中有没有添加到Git索引的文件,需要先执行add操作:
git add ./
git stash
执行以上操作,将本地文件版本恢复至之前与远程分支的最新版本一致,再进行远程分支与本地分支合并操作:
git merge origin/dev
之后再从Git栈中读取最近一次保存的内容恢复至本地分支中:
git stash pop
最后再手动将冲突解决掉,并使用commit和push提交至远程服务器:
git commit -a -m "xxx"
git push -u origin dev
如果本地有执行过commit操作,就不能直接使用stash,需要将版本还原至之前未提交的版本,在执行stash之前操作:
git reset --soft HEAD~x
这里使用–soft保留所有修改,x表示回退几个版本,之后的操作就跟上面一模一样了。 注意:以上做法将丢失本地commit的版本记录
多人在不同分支(feature)操作
可以使用以上方法来实现,也可以使用下面这种。
先将本地分支进行commit:
git add ./
git commit -m \"xxx\"
然后切到开发分支dev,将开发分支更新到最新:
git checkout dev
git pull origin dev
再切回feature分支,使用rebase命令操作,将本地dev与feature合并:
git checkout feature
git rebase dev
在执行过程中,如果有遇到冲突,需要手动解决冲突,再add和continue,如没有冲突可跳过这一步:
git add ./
git rebase --continue
合并完成之后,再切回dev,将feature与dev合并:
git checkout dev
git merge feature
最后再推送至远程dev:
git push -u origin dev
注意:这里用到了git rebase,也可以在同一分支进行操作。这种做法将保留本地commit的版本记录。麻烦的是需要将每次合并的冲突手动解决才能continue。如果有不需要commit的东西,还需要用到git stash
和git stash pop
。