前回プルしてからの変更内容の git diff を生成するにはどうすればよいですか?
質問
できれば rake で、次のアクションを 1 つのコマンドにスクリプト化したいと考えています。
- ローカル git リポジトリのバージョンを取得します。
- Git で最新のコードをプルします。
- ステップ 1 で抽出したバージョンと現在ローカル リポジトリにあるバージョンとの Git diff を比較します。
言い換えれば、中央リポジトリから最新のコードを取得し、最後にプルしてから変更された内容の差分をすぐに生成したいと考えています。
解決
refspecs を使用すると、これを非常に簡単に行うことができます。
git pull origin
git diff @{1}..
これにより、プルの前後に存在した現在のブランチの差分が得られます。プルによって実際に現在のブランチが更新されない場合、差分により間違った結果が得られることに注意してください。別のオプションは、現在のバージョンを明示的に記録することです。
current=`git rev-parse HEAD`
git pull origin
git diff $current..
私は個人的に、単純にログを逆の順序で表示するエイリアスを使用しています (つまり、古いものから新しいものへ)、マージを除く、最後のプル以降のすべてのコミット。プルがブランチを更新するたびにこれを実行します。
git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..
他のヒント
グレッグの この方法はうまくいくはずです(私ではありません、他のグレッグ:P)。コメントに関して、origin は、中央リポジトリをローカル マシンに複製するときに Git によって設定される構成変数です。基本的に、Git リポジトリはそれがどこから来たのかを記憶しています。ただし、git-config を使用する必要がある場合は、これらの変数を手動で設定できます。
git config remote.origin.url <url>
ここで、url は中央リポジトリへのリモート パスです。
これは動作するはずのバッチ ファイルの例です (私はテストしていません)。
@ECHO off
:: Retrieve the changes, but don't merge them.
git fetch
:: Look at the new changes
git diff ...origin
:: Ask if you want to merge the new changes into HEAD
set /p PULL=Do you wish to pull the changes? (Y/N)
IF /I %PULL%==Y git pull
これは私が尋ねた質問とよく似ています git でブランチの変更を取得する方法. 。git diff との動作に注意してください。git log は、2 つのドットを使用する場合と、3つの点。ただし、アプリケーションでは次のものを使用できます。
git fetch
git diff ...origin
その後、 git pull
変更を HEAD にマージします。
これを bash プロファイルにドロップすると、grin (git Remote incoming) と grout (git Remote outcoming) を実行して、オリジンマスターに対して受信および送信されるコミットの差分を確認できるようになります。
function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}
function gd2 {
echo branch \($1\) has these commits and \($2\) does not
git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
function grin {
git fetch origin master
gd2 FETCH_HEAD $(parse_git_branch)
}
function grout {
git fetch origin master
gd2 $(parse_git_branch) FETCH_HEAD
}