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


152

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

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

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

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


11
答えを見るhg incomingと、hg outgoing実際に何をしているのかについて、いくつかの混乱があるようです。私が見つけた最も近いGitの同等物が--dry-runオプションです。ただ、git pull --dry-runあなたが起こるために必要なすべてのもののリストが表示されます。
ロマン・スターコフ2012

回答:


97

Hgのように、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は、シミュレートするgitシェルスクリプトをいくつか作成しましたhg incoming/outgoing。これらはhttp://github.com/ddollar/git-utilsで見つけることができます。


113

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 log .. @ {u}でこれらのエラーが発生します。(私のgit設定には、オリジンとアップストリームリポジトリの両方があります)。エラー: ''の上流ブランチが見つかりません 'エラー:' .. 'の上流ブランチが見つかりませんエラー:' .. 'の上流ブランチが見つかりません致命的:あいまいな引数' .. @ {u} ':不明なリビジョンまたはパスがありません作業ツリー。パスをリビジョンから分離するには、「-」を使用します
Henrik

6
ローカルブランチがアップストリームで構成されていない場合、これらのエラーが発生します。修正するには、を実行しgit branch --set-upstream foo origin/fooます。
Richard Hansen

git log @{u}..リポジトリのすべての変更をリストします。それらがまだ存在しない方法はありません。
ローマスターコフ2012

@romkyns:ローカルブランチの上流に間違ったリモートブランチが設定されている可能性があります。git rev-parse --symbolic-full-name @{u}適切なリモート参照を出力することを確認してください。また、git log @{u}..上流のブランチから到達できないコミットが表示されます。これには、すでにリモートリポジトリにあるコミットが含まれる場合があります(別の参照から到達可能な場合)。これは、すでにプッシュされたブランチにマージした直後に発生します。
Richard Hansen

@RichardHansenリモート参照に何が適切かわからないので、あまりにも初心者ですが、これは、checkout <somebranch>とだけを実行したばかりの、新しく複製されたレポでしたmerge <otherbranch>。この時点で、私は実行しlog @{u}..、すべての変更がリストされているのを見ました。
ロマン・スターコフ2012

42

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

git diff master origin / master


1
私のために働いた(しかし他の方法で)git diff origin/master master
Nick Grealy

34
  1. 「git log origin..HEAD」を使用します

  2. 「git fetch」に続けて「git log HEAD..origin」を使用します。リストされているコミットIDを使用して、個別のコミットを選択できます。

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


3
(リモートブランチを追跡していない場合は、「git log origin / master..HEAD」です。)
plindberg

4
"origin"はリモート追跡ブランチの名前ではなく、リモートの名前です。また、リモート名を指定するだけでは機能せず、リモートトラッキングブランチ(origin / master)を指定する必要があります。
robinst '25年

22

これもあり、すべてのブランチを比較します。

git log --branches --not --remotes=origin

これはgit logのmanページでこれについて述べています:

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

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

git log --remotes=origin --not --branches

8

私はするだろう

$ git fetch --dry-run

のためhg incoming

$ git push --dry-run

のためにhg outgoing


申し訳ありませんが、これはOPへのコメントとして既に述べられていることを見落としました。
クリス

1

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


0

Git着信

$ 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

「git log」と@ {u}の回答で最初に「不明なリビジョン」エラーが表示されたとき、Chris / romkynsの提案を試しましたgit push --dry-run

「5905..4878 master-> master」などの出力が表示されます。5905は、リモートが持つ最新のコミットであり、4878を含む(およびそれを含む)コミットがリモートに適用されます。

次に、他のいくつかのgitコマンドへの引数として5905..4878を使用して、詳細を取得できます。

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

-1

git fetchを実行すると、ブランチ、タグ(refs)を含むすべてのコンテンツが.git / FETCH_HEADに一時的に保存されます。そのコンテンツはコマンドで表示できます:git log FETCH_HEAD接尾辞-aをgit fetchで使用しない場合、FETCH_HEADのコンテンツは新しいコンテンツで上書きされます。これらのコンテンツから、マージするブランチを表示して決定することができます。また、フェッチによってもたらされたものから少数のコミットのみが必要な場合は、単純なチェリーピックを使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.