質問
ここには2つの異なる質問がありますが、それらは関連していると思います。
-
Gitを使用する場合、ローカルでコミットしたが、まだリモートブランチにプッシュしていない変更を見つけるにはどうすればよいですか? Mercurialコマンド
hg outgoing
に似たものを探しています。 -
Gitを使用する場合、プルを実行する前にリモートブランチに加えられた変更を見つけるにはどうすればよいですか? Mercurialコマンド
hg incoming
に似たものを探しています。
2番目:利用可能なものを確認し、プルしたい変更をチェリーピックする方法はありますか?
解決
Hitのように、Gitはそのような情報をネットワーク経由で送信できません。ただし、 git fetch
( hg fetch
よりも hg pull
)を実行して、リモートサーバーから新しいコミットを取得できます。
したがって、 master
というブランチと origin
というリモートがある場合、 git fetch
を実行した後、ブランチも必要です。 origin / master
と呼ばれます。その後、 git log masterを実行することにより、
。これら2つを逆にして逆にします。 master
が origin / master
のスーパーセットである必要があるすべてのコミットの git log
を取得できます。 ..origin / master
私の友人であるDavid Dollarは、 hg incoming / outgoing
をシミュレートするために、いくつかのgitシェルスクリプトを作成しました。それらは http://github.com/ddollar/git-utils で見つけることができます。
他のヒント
Git 1.7.0以降では、一般的に上流ブランチを参照できる特別な構文があります: @ {u}
または @ {upstream}
。
hg着信
を模倣するには:
git log ..@{u}
hg発信
を模倣するには:
git log @{u}..
次の incoming
および outgoing
エイリアスを使用して、上記を使いやすくします。
git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
完全な回答ではありませんが、git fetchはリモートリポジトリをプルし、マージを行いません。 その後、
git diff master origin/master
を実行できます
-
" git log origin..HEAD"を使用
-
" git fetch"を使用その後に「git log HEAD..origin」が続きます。リストされたコミットIDを使用して、個々のコミットをチェリーピックできます。
もちろん、上記は「起源」を想定しています。は、リモート追跡ブランチの名前です(デフォルトオプションでcloneを使用した場合)。
すべてのブランチを比較するためのこれもあります:
git log --branches --not --remotes=origin
これはgit logのmanページでこれについて書かれています:
のいずれかにあるすべてのコミットを表示します ローカルブランチはありますが、 オリジンのリモート追跡ブランチ (あなたがその起源を持っているものはありません’ t)。
上記は発信
用です。
incoming
の場合、スワップするだけです:
git log --remotes=origin --not --branches
やる
$ git fetch --dry-run
hg incoming
および
$ git push --dry-run
hg発信
の場合。
git-out hg outgoing
を非常に正確にエミュレートするスクリプトです。 " push -n"で解析します。出力。プッシュする追加の引数を指定する必要がある場合、正確な出力が生成されます。
git着信
$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch
git outgoing
$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch
" git log" @ {u}の回答により、最初は「不明なリビジョン」と判断されました。エラー、Chris / romkynsの git push --dry-run
の提案を試しました。
「5905..4878 master-> master」などの出力が表示されます。 5905は、リモートが持っている最新のコミットであり、4878を介した(および含む)コミットはリモートに適用されます。
その後、5905..4878を他のいくつかのgitコマンドの引数として使用して、詳細を取得できます。
git diff 5905..4878 # Gives full code changes in diff style
git log --online 5905..4878 # Displays each commit's comment
git fetchを実行すると、ブランチ、タグ(refs)を含むすべてのコンテンツが一時的に.git / FETCH_HEADに保存され、そのコンテンツはコマンドで表示できます: git log FETCH_HEAD git fetchでサフィックス-aを使用しない場合、デフォルトでは、FETCH_HEADのコンテンツは新しいコンテンツで上書きされます。 これらのコンテンツから、マージするブランチを表示して決定したり、フェッチによってもたらされたコミットからほんの数件のコミットが必要な場合は単純なチェリーピックを選択したりできます。