可能ですか?
基本的に、リモートリポジトリがあり、そこから私は単に以下を使用してプルします。
git pull
ここで、私の側の何にも触れずに、このプルが何を変更するか(diff)をプレビューしたいと思います。その理由は、私が引っ張っているものが「良い」ものではない可能性があり、私のリポジトリを「ダーティ」にする前に誰かに修正して欲しいからです。
可能ですか?
基本的に、リモートリポジトリがあり、そこから私は単に以下を使用してプルします。
git pull
ここで、私の側の何にも触れずに、このプルが何を変更するか(diff)をプレビューしたいと思います。その理由は、私が引っ張っているものが「良い」ものではない可能性があり、私のリポジトリを「ダーティ」にする前に誰かに修正して欲しいからです。
回答:
を実行した後、a git fetch
を実行しgit log HEAD..origin/master
て、最後の共通コミットとオリジンのマスターブランチの間のログエントリを表示します。差分を表示するには、git log -p HEAD..origin/master
各パッチを表示するか、git diff HEAD...origin/master
(2つではなく3つのドット)を使用して単一の差分を表示します。
フェッチやってするだけで更新するため、通常のフェッチ元に戻すする必要は、ありません、リモート支店とのどれもあなたの枝を。すべてのリモートコミットでプルアンドマージを実行する準備ができていない場合は、を使用git cherry-pick
して、必要な特定のリモートコミットのみを受け入れることができます。後で、すべてを取得する準備ができたら、a git pull
が残りのコミットにマージされます。
更新:なぜgit fetchの使用を避けたいのか、完全にはわかりません。git fetchが行うのは、リモートブランチのローカルコピーを更新することだけです。このローカルコピーは、ブランチとは関係がなく、コミットされていないローカル変更とは関係がありません。安全なため、cronジョブでgit fetchを実行する人を聞いたことがあります。(ただし、通常はそうすることはお勧めしません。)
git diff ...@{u}
同じであるとしてgit diff HEAD...origin/master
、原点/マスターが上流分岐である場合
git fetchはあなたが探しているものだと思います。
変更とオブジェクトをローカルリポジトリのインデックスにコミットせずにプルします。
これらは後でgit mergeでマージできます。
編集:さらなる説明
Git- SVNクラッシュコース リンクから直接
では、リモートリポジトリから新しい変更をどのように取得しますか?あなたはそれらをフェッチします:
git fetch http://host.xz/path/to/repo.git/
この時点でそれらはリポジトリにあり、次のようにして調べることができます。
git log origin
変更を比較することもできます。git log HEAD..originを使用して、ブランチにない変更だけを確認することもできます。次に、それらをマージしたい場合-ちょうど:
git merge origin
フェッチするブランチを指定しない場合、デフォルトで追跡リモートに設定されます。
マニュアルページを読むと、オプションとその使用方法を最もよく理解できるようになります。
私は例とメモリによってこれをやろうとしているだけで、現在テストするためのボックスがありません。あなたは見るべきです:
git log -p //log with diff
フェッチはgit reset --hard(link)で元に戻すことができますが、ツリー内のコミットされていないすべての変更と、フェッチした変更は失われます。
git reset --soft
か--mixed
?マンページを確認してください。
リモートリポジトリからフェッチし、違いを確認してから、プルまたはマージできます。
これは、リモートorigin
ブランチが呼び出されmaster
、リモートブランチを追跡するというブランチの例ですorigin/master
。
git checkout master
git fetch
git diff origin/master
git pull --rebase origin master
これを行うためのカスタムgitエイリアスを作成しました。
alias.changes=!git log --name-status HEAD..
これであなたはこれを行うことができます:
$git fetch
$git changes origin
これにより、を実行する前に変更をプレビューする簡単で便利な方法が得られますmerge
。
これら2つのコマンドを使用して、変更するファイルを確認できます。
最初にgit fetchを実行すると、次のような出力が得られます(出力の一部)。
... 72f8433..c8af041開発-> origin / develop ...
この操作により、2つのコミットIDが提供されます。1つは古いもので、2つ目は新しいものです。
次に、git diffを使用してこれら2つのコミットを比較します
git diff 72f8433..c8af041 | grep "diff --git"
このコマンドは、更新されるファイルを一覧表示します。
diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php
たとえば、app / controller / xxxx.phpとapp / view / yyyy.phpが更新されます。
git diffを使用して2つのコミットを比較すると、変更された行を含むすべての更新ファイルが出力されますが、grepを使用すると、出力からdiff --gitを含む行のみが検索されて取得されます。
私はパーティーに遅れるかもしれませんが、これはあまりにも長い間私を悩ませてきたものです。私の経験では、作業コピーを更新してそれらの変更に対処するよりも、保留中の変更を確認したいです。
これは~/.gitconfig
ファイルに入ります:
[alias]
diffpull=!git fetch && git diff HEAD..@{u}
現在のブランチをフェッチしてから、作業コピーとこのフェッチされたブランチを比較します。したがって、に伴う変更のみが表示されgit pull
ます。
HEAD..@{u}
か?これはより単純で、リモートに「origin」という名前を付ける必要はなく、ブランチにリモートと同じ名前を付ける必要もありません。
git pull
が気に入らない場合は、マージの一部を中止できるはずです。そのため、これのユースケースが何かはわかりません。
git pull
。あるいは、後で行うことができるかどうかだけです。また、それはopの質問が何であったかだと思います。
git-fetchでローカル.gitを更新したくない場合は、ローカルリポジトリを一時ディレクトリにコピーし、そこでプルします。これがショルハンドです:
$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"
例:
$ git status
# On branch master
nothing to commit (working directory clean)
$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
32d61dc..05287d6 master -> origin/master
Updating 32d61dc..05287d6
Fast-forward
subdir/some.file | 2 +-
.../somepath/by.tes | 3 ++-
.../somepath/data | 11 +++++++++++
3 files changed, 14 insertions(+), 2 deletions(-)
$ git status
# On branch master
nothing to commit (working directory clean)
$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
32d61dc..05287d6 master -> origin/master
$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)
他の場所でレポのクローンを作成し、実際のチェックアウトと新しいクローンの両方でgit logを実行して、同じ結果が得られるかどうかを確認します。