3

短いバージョン:私はmaster、人々が取り組んでコミットしているブランチを持っています。それから私はからのブランチを持っています、それを人々がまた取り組んでいてコミットしているものとmaster呼んでください。定期的に、すべてではありませんが、一部の変更を元に戻しfooたいと思います。の履歴をクエリ可能にして、からのコミットの有無を確認できるようにしたいと思います。これには問題があるようです。どうすればよいですか?foomastermasterfoo

長いバージョン:次のようなサンプルのgitリポジトリを作成します。

cd /tmp && mkdir gitrepo && cd gitrepo/ && git init
echo "Something shared" > myFile.txt && git add myFile.txt && git commit -m "Added myFile.txt to master"
git checkout -b foo master
echo "Something else shared" > anotherFile.txt && git add anotherFile.txt && git commit -m "Added anotherFile.txt to foo"
echo "Something specific to foo" > foochange.txt && git add foochange.txt && git commit -m "Added foochange.txt to foo"
echo "Something else shared again" > yetAnotherFile.txt && git add yetAnotherFile.txt && git commit -m "Added yetAnotherFile.txt to foo"
git checkout master
echo "Something specific to master" > masterchange.txt && git add masterchange.txt && git commit -m "Added masterchange.txt to master"
echo "Specific to master" > masterchange.txt && git add masterchange.txt && git commit -m "Added masterchange.txt on master"

(これ以降のすべての説明は、私たちが参加していることを前提としていますmaster

fooこれで、 2つのコミットが遅れ、3つのコミットがあるという状況になりましたmasterfooこの時点で、最初と3番目のコミットをからに戻したいのですが、2番目masterのコミットは戻しません。

基本的な問題は、先頭のコミットの親がマージしたくないfooコミットであるということですが、コミットの親はそのコミットのハッシュの一部であるため、先頭のコミットのハッシュを保持する方法はありません。マスターに当てはまる状況を作り出すことなく。foogit branch --contains foo^

たとえば、私がそうすると、からへgit merge fooのすべてのコミットがマージされます。それをした後、私は言うことができるでしょう、そしてそれは両方とも言うでしょうそしてそのコミットを含みます。それから試してみましたが、それでもを含むレポートを作成しました。foomastergit branch --contains foo^foomastergit revert foo^git branch --contains foo^masterfoo^

関連する2つのリビジョンの場合git cherry-pick foo foo^^、これら2つのリビジョンの差分からの変更がfoo適用されますmasterが、git branch --contains foo^ブランチにのみfooそのコミットが含まれていると言います。

ここで達成しようとしているのは、履歴をクエリする方法です(コミットメッセージにテキストとして保存されているハッシュを手動で相互に関連付けることなく)。これにより、マスターにマージされたコミットとマージされていないコミットを確認できます。前述のように、マスターの状態を自分が望むものと同等にするためのいくつかの方法(cherry-pick、merge + revert、format-patch / am、diff / patchなど)を知っています。必要な情報について履歴を照会する方法。私はそれgit branch --containsがおそらく私が望むようには機能しないだろうと思いますが、私が考えていなかった履歴を照会する別の方法があれば、私はすべての耳です。

誰かアイデアはありますか?

4

1 に答える 1

5

git-cherryはあなたが探しているコマンドだと思います。

git cherry -v master foo

fooこれは、 (まだ)にマージされていないコミットを示していmasterます。

$ git cherry -v master foo
+ 1cffcfb1d061d308e8d33c262e30282a26b195cb Added anotherFile.txt to foo
+ fe0599190a6953c970cd3f94e18ff0c282e89e2c Added foochange.txt to foo
+ 1b548eb45ff50e59f3522ee63edd0c177e842645 Added yetAnotherFile.txt to foo

$ git cherry-pick 1cffcfb1d061d308e8d33c262e30282a26b195cb
...

$ git cherry-pick 1b548eb45ff50e59f3522ee63edd0c177e842645
...

$ git cherry -v master foo
- 1cffcfb1d061d308e8d33c262e30282a26b195cb Added anotherFile.txt to foo
+ fe0599190a6953c970cd3f94e18ff0c282e89e2c Added foochange.txt to foo
- 1b548eb45ff50e59f3522ee63edd0c177e842645 Added yetAnotherFile.txt to foo

マニュアルから:

上流のブランチですでに同等の変更が行われているものにはマイナス(-)記号が付けられ、ヘッドブランチにのみ存在するものにはプラス(+)記号が付けられます。

于 2012-05-31T13:46:57.003 に答える