ここに2つの異なる質問がありますが、それらは関連していると思います。
Gitを使用する場合、ローカルにコミットしたが、まだリモートブランチにプッシュしていない変更を見つけるにはどうすればよいですか? Mercurialコマンドhg outgoing
に似たものを探しています。
Gitを使用する場合、プルを実行する前にリモートブランチにどのような変更が加えられているかをどのようにして見つけることができますか? Mercurialコマンドhg incoming
に似たものを探しています。
2番目:利用可能なものを確認し、プルしたい変更を選択する方法はありますか?
Hitのように、Gitはそのような情報をネットワーク経由で送信できません。ただし、git fetch
(hg pull
よりhg fetch
に似ています)を実行して、リモートサーバーから新しいコミットをフェッチできます。
そのため、master
というブランチとOrigin
というリモートがある場合、git fetch
を実行した後、Origin/master
というブランチも必要です。 git log
を実行することにより、master
がOrigin/master
のスーパーセットである必要があるすべてのコミットのgit log master..Origin/master
を取得できます。これらの2つを逆にすると、逆になります。
私の友人であるDavid Dollarは、hg incoming/outgoing
をシミュレートするためのgit Shellスクリプトをいくつか作成しました。 http://github.com/ddollar/git-utils で見つけることができます。
Git 1.7.0以降では、@{u}
または@{upstream}
という上流のブランチを一般的に参照できる特別な構文があります。
hg incoming
を模倣するには:
git log ..@{u}
hg outgoing
を模倣するには:
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を使用して、個々のコミットをチェリーピックできます。
上記はもちろん、「Origin」がリモートトラッキングブランチの名前であると仮定しています(デフォルトオプションでcloneを使用した場合)。
すべてのブランチを比較するためのこれもあります:
git log --branches --not --remotes=Origin
これはgit logのmanページがこれについて言っていることです:
ローカルブランチにあるが、Originのリモートトラッキングブランチにないすべてのコミットを表示します(Originにはないもの)。
上記はoutgoing
用です。 incoming
の場合、スワップするだけです:
git log --remotes=Origin --not --branches
私はやります
$ git fetch --dry-run
hg incoming
および
$ git Push --dry-run
hg outgoing
の場合。
git-out は、hg outgoing
を非常に正確にエミュレートするスクリプトです。 「Push -n」出力を解析するため、Pushに追加の引数を指定する必要がある場合は正確な出力を生成します。
「git log」と@ {u}の回答が最初に「unknown revision」エラーを出したとき、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 && git log ..Origin/master --stat
OR
$ git fetch && git log ..Origin/master --patch
$ git fetch && git log Origin/master.. --stat
OR
$ git fetch && git log Origin/master.. --patch