commitA commitB commitMergeTest commitC,比如最近有4个提交,commitMergeTest 这次提交有人合错分支了(本来打算合master,却合了test分支),想要把这次提交的代码踢除。
解决办法:从 commitC 切一个新分支出来,然后用 cherry-pick 合并commitB commitA(当然,这种方法只适合处理要添加的提交少的情况,如果要添加的提交很多,要 cherry-pick 很多次,会很麻烦)。
git checkout -b newBranch commitC
git cherry-pick commitB
git cherry-pick commitA
git push origin newBranch:newBranch //如果远端还没有newBranch分支的话
1. 分支合并信息
分支合并时,如果合并的2个分支都有新的 commit,合并时git自动会生成一个“merge branch 'xxx' into xxx” 的提交记录,如果合并的2个分支有一个分支没有新的 commit 则此次合并不会生成新的 commit。
“merge branch 'xxx' into xxx” 这个提交记录里更改的内容是从另外一个分支合过来的所有提交更改的总和 + 解决合并冲突更改的代码。
2. 本地有新提交时拉取远程代码或者拉取远程代码到本地有冲突解决后自动生成的信息
“Merge branch 'gray3_pre_1112_cf' of http://git2.xxx.cc/erp/erp-frontend into gray3_pre_1112_cf”
$ git rm -r --cached .idea //--cached 不会把本地的 .idea 删除
$ git commit -m 'delete .idea dir'
$ git push
分支合并有冲突时,不管是通过 VSCode 的“用当前的”、“使用传入”的解决冲突,还是直接把需要的代码复制出来放在冲突代码块外面的方式解决冲突,后续再重新合一遍就合不进来了,也不会提示有冲突。
原因:上次合并的时候已经把提交记录带到了当前分支,所以再次合并的时候,git 对比分支差异认为那些commit已经合并过了,所以不会再次提示冲突,其实跟怎么处理冲突无关。
我们需要将 2dfbc7 和 c4e858 合并成一个 commit,我们输入以下命令:git rebase -i f1f92b
接着会进入 vim 界面,按 i 会进入编辑模式,我们把第一条命令之外的 pick 改成 squash(pick 是要提交的,squash 是被压缩的),然后按 ESC 或 Ctr + C 退出编 辑模式进入命令模式,接着输入 :wq 保存并退出。
接着我们看到了 commit message 的编辑页面
我们要做的是把2次提交信息修改成一个新的 commit message。
输入 :wq 保存并退出,再次输入 git log 查看历史信息,发现2次 commit 已经合并了。
最后,git push 到远程库。
注意事项:如果合并过程中发生错误,可以使用 git rebase --abort 来撤销修改,回到没有开始操作合并之前的状态。
1. <<<< 当前代码 ==== 传入的代码 >>>>>
2. 空文件夹不会被提交到远程仓库。
3. 如果你想修改别人 GitHub 上的项目,你可以 fork 他的项目到自己的 GitHub 上,修改完往自己的仓库推送。然后向对方发起一个 Pull Request。
4. 所有的版本控制系统,只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的。
千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,
5. 开发中推荐使用 git 可视化工具: Source Tree 来简化对 git 的操作。
6. git 命令很多,想不起来的时候用 -h 查看帮助。比如:git branch -h, git tag -h 等等。
7. 工作区的内容在切换分支时会被带过去。
8. gitignore 里被git忽略的文件,整个项目用的是同一份,不会因为分支的改变而改变。