常用命令
git add
git commit
git push
Git合并冲突了,怎么办?
什么时候产生冲突
当我们有两个人分别用 f1 和 f2 两个分支开发代码时,不小心都改到同一行,这时候两个人并没有意识到,当他们开发完成后,就会将修改的代码通过add、 commit 以及最终push到远程repo去请求合并。这个时候,远程repo发现同一行代码有不同修改,不知道要合并哪一个,这时就产生冲突了。
怎么解决冲突?
这时候肯定需要有一个人(或者说有一个分支)做出让步,要么合并 f1 冲突的行,要么合并 f2 冲突的行。 假设 f1 要做出让步比较厉害,对git玩得很溜,这时候他提出要来解决这个冲突,于是他告诉我们,他是按照下面的原理来解决的:
- f1 这个人在本地切换到主分支:git checkout master
- 它将本地的master和远程的master做了同步:git pull origin master
- 此时切换会 f1 分支:git checkout f1
- 使用rebase将f1 变基到 master : git rebase master
- 这个时候git可能会提示它有冲突,需要解决,于是他就到冲突的那个文件中,将想要保留的代码留着,其它的删除,这样就解决了冲突。
- 于是添加修改信息:git add .
- 继续变基 : git rebase --continue
- 如果这个时候还有冲突,那就按照 5- 7 的步骤解决,知道冲突解决。
- 最后,通过一个提交:git commit -m ‘resolve confilct’
10.然后,强推一把代码到远程:git push -f
就这样, 它完成了冲突的解决。
git pull 和 git fetch & git merge
在上面解决冲突,有一个步骤是git pull,他的作用可以理解为将本地代码和远程代码同步。 git pull 主要做两个事情:1. 拉取远程代码到本地(git fetch --all) 2. 合并本地代码和远程的差异(git merge origin master) 因此,可以简单地理解git pull 约等于 git fetch + git merge,更具体的原理,给大家推荐一个视频: GIt Fetch+Git merge 和 Git Pull 的区别
最佳实践
假设要开发一个新功能,那么可以按照下面的方法实践;
- 切换到master,拉取最新代码
git checkout master
git pull origin master
- 创建一个新分支,并基于这个分支提交代码
git checkout -b feature/name
- 添加、提交、推送代码
git add .
git commit -m 'comment'
git push
- 将指定分支推到远程。
如果忘记切换新分支,直接在master开发了,怎么办?
假设现在要开发一个新功能,但是我忘记切换新分支,一直在master开发,直到要合并了才知道。这个时候,可以采用下面的方法
- 先将master这些修改提交,但是不要推送
git add .
git commit -m 'commit'
- 切换会修改前的那个分支
查看修改前的分支 : git reflog
- 如图,上次的版本号为标红框的地方,于是回退到这个版本,并且在这个版本新建分支
git reset --hard b766811
- 在这个版本新建分支
git checkouot -b f2
- 将 f2 分支切换到之前在master修改的那个版本,与是 f2 就指向了那个原本在mster修改的版本,此时效果类似与在 f2上修改代码
git reset --hard a6e382a
- 按照之前的方法,推送到远程。
参考
Git Rebase 与解决冲突 GIt Fetch+Git merge 和 Git Pull 的区别 git解决合并冲突
|