本地操作

  • 取消 commit

    • 如果不小心把内容 add 并且 commit 了,这个时候再把该文件添加到 .gitignore 已经晚了,应当取消对应的 commit 记录,再重新 add commit,(但注意是 soft 而不是 hard 否则物理文件版本也会回滚到之前)
      1. git reflog # 先查看commit要回滚到哪个版本
      2. git reset --soft HEAD~3
  • HEAD

    • 如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD
  • 分支操作:
    • git branch -f 分支名 目标移动到的位置
    • git cherry-pick c2 c4:c2,c4直接被抓过来到当前分支下
      • 选取节点会以此被放到当前分支
  • 交互式rebase

    • 在不知道具体哈希值时候常使用,—i
    • rebase UI 可以做到:调整提交顺序,删除提交(pick),合并提交
      • 注意并不是真的改变原始提交顺序,而是按照顺序进行复制,并移动当前分支到新的提交
        1. # 注意指明从哪里开始rebase,可以使分支名或HEAD~4形式
        2. git rebase -i start_branch
  • 错误 track 后修改 .gitignore 也无效,正确修改方法如下:

    1. git rm -r --cached .
    2. git add .
    3. git commit -m 'update .gitignore'

    多人协作

场景1

团队成员 PR 了有冲突的代码,但我不关心有冲突的地方,只想合并其部分文件夹/文件

  • 解决
    • 新建分支:
      • 方法一:git checkouot -b new-branch
      • 方法二:git branch -d new-branch
    • 新建 remote 仓库:git remote add <name> <url>
      • 显示当前所有 remote 以及链接:git remote -v
    • 如果做了改动,保证 stash 所有变动,或者 commit 现有变动(关键)
    • 强制在 new-branch 分支拉取目标文件:git pull --force <name> master
    • 切换回原来分支:git checkout master
    • 取目标文件夹:git checkout new-branch folder-path
    • 本地操作完成,继续 add, commit, push 一条龙
    • 扫尾工作:删除多出来的冗余分支
      • git branch -d <branchname> 可以删除已经全部合并的分支
      • git branch -D <branchname> 强行删除未完全合并的分支
  • 其他补充
    • 简单的冲突可以使用 git mergetool 交互性修改,但是太复杂的不方便修改
    • git merge --abort/--continue 可以停止当前 merge,继续当前 merge