web-dev-qa-db-ja.com

Gitを使用して、ローカルとリモートの間の変更を見つける方法

ここに2つの異なる質問がありますが、それらは関連していると思います。

  1. Gitを使用する場合、ローカルにコミットしたが、まだリモートブランチにプッシュしていない変更を見つけるにはどうすればよいですか? Mercurialコマンドhg outgoingに似たものを探しています。

  2. Gitを使用する場合、プルを実行する前にリモートブランチにどのような変更が加えられているかをどのようにして見つけることができますか? Mercurialコマンドhg incomingに似たものを探しています。

2番目:利用可能なものを確認し、プルしたい変更を選択する方法はありますか?

149
ejunker

Hitのように、Gitはそのような情報をネットワーク経由で送信できません。ただし、git fetchhg pullよりhg fetchに似ています)を実行して、リモートサーバーから新しいコミットをフェッチできます。

そのため、masterというブランチとOriginというリモートがある場合、git fetchを実行した後、Origin/masterというブランチも必要です。 git logを実行することにより、masterOrigin/masterのスーパーセットである必要があるすべてのコミットのgit log master..Origin/masterを取得できます。これらの2つを逆にすると、逆になります。

私の友人であるDavid Dollarは、hg incoming/outgoingをシミュレートするためのgit Shellスクリプトをいくつか作成しました。 http://github.com/ddollar/git-utils で見つけることができます。

97
Jordi Bunster

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}..'
110
Richard Hansen

完全な答えではありませんが、git fetchはリモートリポジトリをプルし、マージを行いません。その後、することができます

git diff master Origin/master
42
Martin Redmond
  1. 「git log Origin..HEAD」を使用します

  2. 「git fetch」の後に「git log HEAD..Origin」を使用します。リストされたコミットIDを使用して、個々のコミットをチェリーピックできます。

上記はもちろん、「Origin」がリモートトラッキングブランチの名前であると仮定しています(デフォルトオプションでcloneを使用した場合)。

32
Greg Hewgill

すべてのブランチを比較するためのこれもあります:

git log --branches --not --remotes=Origin

これはgit logのmanページがこれについて言っていることです:

ローカルブランチにあるが、Originのリモートトラッキングブランチにないすべてのコミットを表示します(Originにはないもの)。

上記はoutgoing用です。 incomingの場合、スワップするだけです:

git log --remotes=Origin --not --branches
22
robinst

私はやります

$ git fetch --dry-run

hg incomingおよび

$ git Push --dry-run

hg outgoingの場合。

8
chris

git-out は、hg outgoingを非常に正確にエミュレートするスクリプトです。 「Push -n」出力を解析するため、Pushに追加の引数を指定する必要がある場合は正確な出力を生成します。

1
stepancheg

「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
0
pierce.jason

git incoming

$ git fetch && git log ..Origin/master --stat
OR
$ git fetch && git log ..Origin/master --patch

git発信

$ git fetch && git log Origin/master.. --stat
OR
$ git fetch && git log Origin/master.. --patch
0
prayagupd