本地操作
取消 commit
- 如果不小心把内容 add 并且 commit 了,这个时候再把该文件添加到 .gitignore 已经晚了,应当取消对应的 commit 记录,再重新 add commit,(但注意是 soft 而不是 hard 否则物理文件版本也会回滚到之前)
git reflog # 先查看commit要回滚到哪个版本git reset --soft HEAD~3
- 如果不小心把内容 add 并且 commit 了,这个时候再把该文件添加到 .gitignore 已经晚了,应当取消对应的 commit 记录,再重新 add commit,(但注意是 soft 而不是 hard 否则物理文件版本也会回滚到之前)
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),合并提交
- 注意并不是真的改变原始提交顺序,而是按照顺序进行复制,并移动当前分支到新的提交
# 注意指明从哪里开始rebase,可以使分支名或HEAD~4形式git rebase -i start_branch
- 注意并不是真的改变原始提交顺序,而是按照顺序进行复制,并移动当前分支到新的提交
错误 track 后修改 .gitignore 也无效,正确修改方法如下:
git rm -r --cached .git add .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
- 显示当前所有 remote 以及链接:
- 如果做了改动,保证 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
- 简单的冲突可以使用
