以下情况都是在本地修改代码完,commit 提交到本地仓库后遇到的情况,也就是最后的 push 没有成功引起的操作
① 不同账号修改了不同文件
当前其他账户提交了修改后,本地分支与远程分支之间就不是 fast-farwards了,所以需要先获取远程分支最新 commit ID再合并,操作如下:
// 方式一,这个时候可以保证远端分支的 commit 就是线性的,然后本地 commit id 会被改变
① git fetch origin/master
git pull origin/master
git rebase origin/master
// 方式二,保持本地 commit id 不变,与远端分支合并,这个时候远端分支的节点看起来就不是一条直线了
② git pull origin/master
git merge origin/master
最后再 git push
② 不同账号修改了同一个文件内容
这种情况就比较麻烦了,因为要手动合并修改的内容,但是在工作中又经常遇到。此时通常已经先通过 git commit -am 提交到本地分支了,只是最后一步的 git push 失败了。后续操作如下:
// 先 pull 获取远程仓库最新代码,此时会提示有冲突的文件
git pull
// 此时通过 vim 或者 git diff 文件名打开文件,也可以在外部用notepad++打开有冲突的文件
<<<<<<<<<HEAD
//这之间为当前账号修改的内容
=========
//这之间为其他账号修改的内容
>>>>>>>>
此时与其他同事沟通确定保留哪些内容, 修改后再提交和推送远程仓库。
git commit -am "merge some conflict code"
//检查一下工作区
git status
最后再 git push
③ 不同账号修改了同一个文件的文件名
//先更新
git pull
//此时会出现其他账户和当前账户修改文件名后的文件, 需要通过 add 或者 rm 确定最终保留的文件
ls -al
git add 保留文件名
git rm 丢弃文件名
//检查一下工作区
git status
//提交解决的冲突
git commit -am "reslove file name conflict"
最后再 git push
④ 将指定文件回退到指定版本
//先查看指定文件的历史版本ID
git log filename
例如查看file目录的 readme.txt:
git log file/readme.txt
// 复制想要恢复的版本 commitID, 然后checkout
git checkout ${commitID} file/readme.txt
//检查一下工作区, 看看是否确定更新了
git status
//提交解决的冲突
git commit -am "resume file/readme.txt"
最后再 git push
⑤ git push 需要指定分支名
git push 时提示以下信息:
fatal: The upstream branch of your current branch does not match
the name of your current branch. To push to the upstream branch
on the remote, use
git push origin HEAD:master
To push to the branch of the same name on the remote, use
git push origin HEAD
此时需要指定当前分支远程分支的链接
git branch --set-upstream-to=origin/master
//origin/master为远程仓库的分支
⑥ 撤销 commit 中的部分文件
某些时候通过 git commit -am"xxx" 命令提交时不小心把一些配置文件给一起 commit 了, 假如要撤销部分 commit 的文件, 那么操作如下:
a、先找到对应文件的 log
git log <filename>
b、回退目标文件至上一个版本
git reset <commitID> <filename>
c、更新一下目标文件
git checkout filename
// 或者想把某个文件回退到指定版本
git checkout <commitID> <filename>
d、修改 commit 信息
git commit --amend
最后再 git push
⑦克隆仓库 拉取代码时提示权限不够
用同事的电脑登录自己的 gitlab 账号就出现这个问题了。通过在仓库地址前加上用户名来解决,这个时候会提示输入用户名密码,正确输入密码后即可克隆仓库拉取代码。示例如下:
//假设地址为
http://192.168.xxx.xxx/xxx.git
//那么添加用户名后的拉取方式为:
git clone http://uesrname@192.168.xxx.xxx/xxx.git
git pull
⑧ cherry-pick 部分文件
通常情况下,直接 cherry-pick 源分支的 commit 过来后,当前分支也是直接到了 commit 状态,假如只 cherry-pick 部分文件这个时候就不方便 。可以使用下面的命令:
git cherry-pick -n <commit>
此时 cherry-pick 过来后是暂存状态,对于不需要 commit 的文件直接使用 checkout 还原即可。
git checkout HEAD <path>
这里提供几个快速合并冲突的办法
//保留本地
git checkout HEAD -- <path>
or
git checkout --ours -- <path>
//保留传入
git checkout MERGE_HEAD -- <path>
or
git checkout --theirs -- <path>