2012-12-19 10 views
19

私はまだGitの(基本的な)細かい点を勉強しようとしており、困ったことに気づいています。私はHEADでいくつかの間違いを犯し、古いコミットをチェックアウトし、そこからコーディングを開始したことに気付きました。私がプッシュしようとすると、私の現在のコミットが遅れていると言われ、私はHEADとマージする必要があります。 Gitは "git pull"を推奨しています。しかし、HEADには無視したいコードがあります。この問題をどうやって解決するのですか?助けてくれてありがとう。Gitで古いコミットヘッドを作るにはどうすればいいですか?

フローチャート:

-------- HEAD (bad) ---------------------- + (behind conflict, requires 
    \         / merge with HEAD, which is 
     \------- Current commit (good) ----/ bad and needs to be ignored) 

答えて

9

リポジトリが他の人々によって使用されていない場合は、あなたが安全にリモートブランチを上書きするgit push -fを行うことができます。

+6

-1: 'git push -f'は本当に「安全に」一緒に行かないのですが...落とし穴を明確にするか、言い回しを「carefu lly " - 反対の意味。 – ANeves

+1

@ANeves私は私の言葉で立っています。リポジトリを使用している唯一の人は完全に安全です。彼の言明された意図は地元の仕事を元に支店の現状を上書きする*ことです。これは 'git push -f'の目的です。 – meagar

+1

私はそれがちょうど 'プッシュ-f'が必要であるように見えることに同意します。 –

2

「git push -f」は、リポジトリを使用している唯一の人であるため、正しく機能します。これは大部分の人にとっては容認できる解決策ではありません。

はここにあなたの現在のコミットの歴史です:

---A-B < HEAD (bad) 
    \ 
    C < my_branch (good) 

これは、あなたが望む解決策があります。これは、HEADのブランチ上のすべての変更を踏みつけるます

git checkout my_branch 
git merge -s ours HEAD 

How do I 'overwrite', rather than 'merge', a branch on another branch in Git?

をおさらいするには、次のようにしてください:

--A-B-D < HEAD, my_branch (both good) 
    \/
    C 

DはこのケースではCと実質的に同じですが、それはちょうど異なる親を持っています。ここで

+0

'HEAD'は使用しないでください。それは 'merge -s ours oldbranch'でなければなりません。あなたがチェックアウトするとHEADが変わります。 –

15

はあなたが何ができるかです:あなたはプッシュを強制しない場合

git checkout <branch-to-modify-head> 
git reset --hard <commit-hash-id-to-put-as-head> 
git push -f 

、gitのは、このエラーがスローされます。あなたの現在のブランチの先端が遅れているため、更新は拒否されました。

これはあなたのgitの履歴を改ざんするので、これを行う別の方法はあなたが望まないそれぞれのコミットを元に戻すことに注意してください。あなたがあなたの歴史を保持していること方法:私は

git revert commit-id 

乾杯

4

方法は次のとおりです。

git reset --hard <commit-SHA> 
git push origin HEAD:<name-of-remote-branch> 

それはgitのが推奨する方法だとgit push -fを行うことで皆のために少し問題があるかもしれません開発チーム

関連する問題