Git 如何忽略部分 commits,只 push 一部分 commits 呢?

lips · 2015年04月12日 · 最后由 ery 回复于 2015年06月02日 · 20646 次阅读

A --- c1 ---c2

clone 后,在本地提交了 c3-7 5 个 commits, 但是最后只想提交 c6 和 c7 到远程服务器,这可以做到么? A----c1 --- c2 \---c3 ----c4 ---- c5 ---- c6 ---- c7

git rebase -i head~7,然后将 c6,c7 移到 c1,c2 之前变成 A---c6---c7---c1---c2---c3---c4---c5,然后再 check out 新的 branch,到 c7,然后推送到远程

如果交互式 rebase 有困难的话,简单一点也更好理解:

  1. 建立一个分支
  2. 回到 master(我假定你原来在 master),reset --hard 到 c2
  3. cherrypick c6, c7 到 master,然后 push

另外那个分支不要了可以删掉,或者留着 reset --hard 到 c5,这样随时可以 merge 或 cherrypick 到 master

如果没有提交到远程的话,先 git reset --soft c2, 将所有的 commit 回滚,但是保留代码,然后重新 commit 就可以了

基于你远程分支 开一个新的分支, 然后 把你想要的 commit 一个一个的 cherry-pick 到新分支。 最后 psuh 本地新分支,到远程分支

#4 楼 @ery 本地新分支,最后删除?本质上是把远程分支上的部分 commit 删除掉么?

远程分支A C1 -- C2
本地分支A C1 -- C2 -- C3 -- C4 -- C5 -- C6 -- C7

创建新本地分支 B(基于远程分支 A)

git checkout -b B origin/A
远程分支A         C1 -- C2
本地分支A         C1 -- C2 -- C3 -- C4 -- C5 -- C6 -- C7
本地分支B (新分支) C1 -- C2

选择你想要的 commit

git cherry-pick C6
git cherry-pick C7

注意 cherry-pick 后 CommitID 会变化

C6 -> D6 C7 -> D7

远程分支A         C1 -- C2
本地分支A         C1 -- C2 -- C3 -- C4 -- C5 -- C6 -- C7
本地分支B (新分支) C1 -- C2 -- D6 -- D7

推送本地分支 B 到 远程分支 A

git push origin B:A
远程分支A         C1 -- C2 -- D6 -- D7
本地分支A         C1 -- C2 -- C3 -- C4 -- C5 -- C6 -- C7
本地分支B (新分支) C1 -- C2 -- D6 -- D7

删除分支 B,让本地分支 A 和远程分支 A 保持一致

git checkout A
git branch -d B
git reset origin/A --hard
远程分支A C1 -- C2 -- D6 -- D7
本地分支A C1 -- C2 -- D6 -- D7
需要 登录 后方可回复, 如果你还没有账号请 注册新账号