Git 疑难杂症
1、git stash pop 显示 xxx already exists, no checkout
当我们先使用 git stash save -u '保存信息说明' 来储藏更改,然后拉取代码 git pull,如果你的本地修改有新建文件,远程也有新建文件,并且两者同名,此时应用储藏 git stash pop 就可能会报错: xxx already exists, no checkout。新建且冲突的文件会被提示。
此时我们可以使用:
git stash branch branchName
上面的命令是新建了一个分支。应该是基于最新的储藏处于的仓库版本来建立分支,并且该分支已经应用了最新的储藏(目前没有验证过)。当你将 stash 运用到最新版本的分支后发生了冲突时,这条命令会很有用。
新建了该分支后,就可以通过切换分支,合并分支来应用你的储藏了。
如果你需要指定某个 stash,你可以指明 stash id。
git stash branch <name> stash@{1}
或者你可以创建一个新分支,然后在新分支上删除已存在的文件,在新分支上应用储藏,然后在工作分支上合并新分支即可。
2、git commit 提示Please supply the message using either -m or -F option
使用不带参数的 git commit 命令有可能会提示Please supply the message using either -m or -F option,这是因为系统的默认的文本编辑器 vi 有问题,我们可以为 git 换一个默认的编辑器,比如 vim。输入下面命令:
git config --global core.editor "vim"
然后就可以使用 git commit 命令了。此时系统会弹出文本编辑框让你输入版本信息。
如果你不在文本编辑器中输入版本信息而是直接提交的话,此时的提交信息就会由系统自动生成,比如是:Merge branch xxx of xxx into xxx 之类的合并提示信息。
3、误操作git stash drop,如何恢复删掉的stash
参考:https://blog.csdn.net/lnktoking/article/details/108281589
4、如何将某个分支的指定commit提取出来应用到其他分支
git cherry-pick
命令的作用,就是将指定的提交(commit)应用于其他分支。
git cherry-pick <commitHash>
使用 git cherry-pick 的话将会直接应用修改并自动提交一个版本,添加一个 -n 参数就不会自动提交版本:
git cherry-pick -n <commitHash>
参考:http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html
4、Git已提交commit到远程仓库,如何回退版本
可参考:https://blog.nowcoder.net/n/a9cb57d9343b43b8a645ca8ba3dd46cd
其实总结起来也就几种方法,如下:
- 手工删除需要回退的commit的修改,然后重新提交一个commit到远程仓库
- 使用git reset --hard 强制回退版本,并通过 git push --force 强制推送。
- 缺点:如果需要回退的版本后面已经提交了几个版本,该命令会将后面的提交也删除掉,其他同事的提交可能就不见了
- 缺点:其他同事也需要执行 git reset --hard 回退版本才行,所以不推荐该方法。因为其他同事的本地分支在你的前面,所以版本会直接往前,不会以你强制提交的为准
- 使用git revert commitId 消除某个版本的提交,并通过 git push --force 强制推送。
- 缺点:如果需要消除的版本的后面的版本跟需要消除的版本修改了同一个文件,就会产生冲突,此时 revert 命令应该会失败。
所以以上推荐第 1、3 方法