2016-01-08 8 views
5

特定のコミットに対して「担保」コミット(同じ行を編集しているため、競合が発生するコミット)を特定する方法はありますか?git revert:実際に元に戻す前に、競合する可能性のあるコミットを特定することは可能ですか?

非常に単純化した例

$ git init 
$ echo test > test 
$ git add test 
$ git commit -m "First commit" 
$ echo test1 > test 
$ git commit -am "Second commit" 
$ git l 
* 95a29dd Second commit 
* 30a68e6 First commit 
$ type test 
test1 

この時点で、何らかの理由で、私は30a68e6を戻したいと仮定。

$ git revert 30a68e6 
error: could not revert 30a68e6... First commit 
hint: after resolving the conflicts, mark the corrected paths 
hint: with 'git add <paths>' or 'git rm <paths>' 
hint: and commit the result with 'git commit' 

当然、これは95a29ddので、同じ行を編集し、衝突をもたらすであろう。

30a68e6を復元すると競合が発生する可能性がありますか?そうであれば、コミットする(つまり95a29dd)?

コンテキストを少し分けるには、私は自動的に復帰するためにコミットが必要なので、これが必要です。この場合、30a68e6を元に戻す必要があることが分かっている場合は、「担保」コミットを特定できるようにする必要があります。最初に元に戻す必要があります(30a68e6など)。 30a68e6..HEADのすべてを元に戻すことが分かっていますが、30a68e6と競合しないコミットを元に戻すことは避けてください。

+0

密接に関連:http://stackoverflow.com/q/29517440/2541573 – Jubobs

+0

多少関連しています:https://github.com/felipec/git-related – max630

答えて

0

git revertは元に戻すのは簡単です。復帰コードの戻りコードを確認し、失敗した場合は(復帰コード1)、復帰コード0の場合はgit reset --hard HEAD~1を実行し、復旧コードを保持しない場合は実行してください。

git bisectと組み合わせて、必要に応じて履歴を検索することができます。

+0

私はgit revertを元に戻す方法を知っていますが、それは私にコミットが矛盾していたという情報を与えません –

+0

私はマージアルゴリズムが介入を見ていないと思います介入しているコミットをbisectなどで手作業でテストする方法を見つける必要があるかもしれません。 – oyvind

+0

これは興味深いかもしれません:http://stackoverflow.com/q/8435343/1463246。これは、行の 'git log'に関するものです。 – oyvind

2

(免責事項:この答えはIs there some kind of 'git rebase --dry-run', which would notify me of conflicts in advance?に私の答えに似ている)

30a68e6を元に戻すことは紛争につながることを事前に知ることが可能になり、そうであれば、(つまり、コミットするものと95a29dd)?

執筆時点(Git v2.7.0)では、実際に復帰を試みる前に、矛盾を起こすかどうかを知る方法はありません。

ただし、git revertを実行して競合すると、プロセスは停止し、ゼロ以外のステータスで終了します。あなたは何ができることは差し戻し操作の終了ステータスをチェックし、そして、それがゼロでない場合は、復帰をキャンセルするgit revert --abortを実行します:

git revert ... || git revert --abort

+0

答えをありがとう。これは、部分的に機能します。なぜなら、どのコミットが競合を引き起こしているかを私が知ることができないからです。または私は何かを逃している? –

関連する問題