一个git项目往往是多人同时进行开发的,每个人都会向远程仓库(remote repository)提交各自的版本(commit),也会从远程仓库pull拉去最新的更新,但是因为自己本版本与远程版本号不一致,或者本地仓库文件的原因导致pull失败。
这种问题主要是由于远程仓库有人添加了新的提交,但是本地你自己有增加了新的提交,两者中间处在了冲突,就如下图再第3个版本之后远程仓库别人提交4,5版本,而本地有增加了6,7版本因此push操作就会存在问题。
图1
办法 1:
通过git pull将远程的更新的部分拉取到本地,并会自动合并到本地的分支上面,没有conflict可以直接使用git push将本地的版本成功上传到远程仓库。如果远程版本以及本地新增的版本对同一文件同一行的内容更改会出现CONFLICT (content)见图2: Merge conflict in filename ,将存在冲突的文件手动修改完毕后,使用git add filename ,然后执行git merge --continue 将完成merge操作,最后使用git push操作。
图2
图3
图3是存在conflict的文件,其中<<<HEAD与======之间是本地修改的部分,=====与>>>>之间是从远程仓库更新的部分。
git pull #拉去远程仓库更新
#################如果出现文件 conflict,执行#中的操作############
vi 冲突文件的名字
git add 冲突文件的名字
##############################################################
git push file
合并之后的版本记录如图4,这种方法会产生一个两者合并的merge commit版本记录。
图4
办法2:
既然是本地仓库版本与远程仓库版本不一致,因此我们可以将本地版本号移动至与远程仓库共同的父节点,也就是图一中3号节点,但是我们的最近的修改有需要保存下来,因此我们可以使用git reset commit_3该操作会将本地的版本号恢复至commit_3的版本,我们先使用git stash 操作将本地的更改存入本地栈,然后执行git pull,之后再使用git stash pop 或者git stash apply stash@{0}将原先本地的修改恢复到现在的最新版本之后,如果出现图4所示的错误,说明我们恢复出来的更改与pull下来远程仓库最新更新发生在同文件同一行,我们修改后确保a.sh文件无误后,依次执行 git add ,git commit ,git push即可成功将本地更改上传到远程仓库。
图5
#回退到与远程仓库的共同父节点
git reset HEAD~n or git reset parent_commit_d
#从共同父节点后进行的修改贮存在栈中
git stash -m "message" #message是给这次stash追加的备份信息
git pull #拉取远程仓库更新的内容
################出现 confit #####################
vi 冲突的文件名字
####################################################
git add
git commit
git push
合并之后的版本记录如图6,这种方法将从共同父节点之后的更改重新生成一个commit版本号,看起来是一条直线,但却丧失了之前的版本6,7历史记录。