注:この質問の動機は、理解を深めることgitであり、特定の問題を解決することではありません。IOW、「同じことを達成する」ための別の方法(つまり、タイトルの質問を回避する)は要点から外れます。
コマンド
git pull
...シーケンスと同等であると想定されています
git fetch
git merge
(つまり、リモートとそこからプルするブランチの明示的な引数を使用して)は、に続く?git pull <REMOTE> <BRANCH>の同様のシーケンスに分解できます。fetchmerge
fetchその部分は単純だと思います
git fetch <REMOTE> <BRANCH>
...しかし、もしそうなら、私はそれに続く正しいことがわかりませんgit merge ....
私は「明らかな」ことを試しました。たとえば、 を実行すると、ブランチ間のgit branch -r出力リストが表示されるので、 を試しましたが、 で応答し、 を試行する前と同じコミットのままであることを示しています。これを確認するために、次のようにandを への呼び出しで囲みました。<REMOTE>/<BRANCH>git merge -m 'some message' <REMOTE>/<BRANCH>gitAlready up-to-date.git-logHEADgit mergegit fetch ...git merge ...git log ...
git log --all --oneline --graph --decorate -10
git fetch <REMOTE> <BRANCH>
git merge -m 'some message' <REMOTE>/<BRANCH>
git log --all --oneline --graph --decorate -10
への 2 つの呼び出しによって生成される出力git log ...は同一であり、どちらもローカル<BRANCH>が より進んでいることを示してい<REMOTE>/<BRANCH>ます。
次のおもちゃの例は、/bin/shスクリプトの形式で、上で説明した結果を再現しています。(スクリプトは Ubuntu Linux; YMMV でテストされました。)
#!/bin/sh
BASEDIR=/tmp/gittest
REMOTENAME=remrepo
REMOTEURL="$BASEDIR/$REMOTENAME"
BRANCHNAME=test
BRANCHNAME=master
rm -rf $REMOTEURL
mkdir -p $REMOTEURL
rm -rf $BASEDIR/clone1 $BASEDIR/clone2
git init --bare -q $REMOTEURL/.git
git clone -q -o $REMOTENAME $REMOTEURL $BASEDIR/clone1
git clone -q -o $REMOTENAME $REMOTEURL $BASEDIR/clone2
pushd $BASEDIR/clone1 >/dev/null
git checkout -qb $BRANCHNAME
echo $RANDOM >> random1.txt
git add .
git commit -qam "$(date -Ins)"
git push -q $REMOTENAME $BRANCHNAME
pushd $BASEDIR/clone2 >/dev/null
git pull -q $REMOTENAME
git checkout -q $BRANCHNAME
echo $RANDOM >> random2.txt
git add .
git commit -qam "$(date -Ins)"
git push -q $REMOTENAME $BRANCHNAME
echo
echo 'git log --all --oneline --decorate --graph :'
git log --all --oneline --decorate --graph
echo
pushd >/dev/null
git checkout -q $BRANCHNAME
echo $RANDOM >> random1.txt
git commit -qam "$(date -Ins)"
echo 'git log --all --oneline --decorate --graph :'
git log --all --oneline --decorate --graph
echo
git fetch -q $REMOTENAME $BRANCHNAME
git merge -m "$(date -Ins)" $REMOTENAME/$BRANCHNAME
echo
echo 'git log --all --oneline --decorate --graph :'
git log --all --oneline --decorate --graph
git pull -q --no-edit $REMOTENAME $BRANCHNAME
echo
echo 'git log --all --oneline --decorate --graph :'
git log --all --oneline --decorate --graph
実行すると、出力は次のようになります。
warning: You appear to have cloned an empty repository.
warning: You appear to have cloned an empty repository.
git log --all --oneline --decorate --graph :
* 2326793 (HEAD, remrepo/master, master) 2013-03-19T10:56:42,838038000-0400
* 34ea848 2013-03-19T10:56:42,360743000-0400
git log --all --oneline --decorate --graph :
* 81cb43f (HEAD, master) 2013-03-19T10:56:43,057198000-0400
* 34ea848 (remrepo/master) 2013-03-19T10:56:42,360743000-0400
Already up-to-date.
git log --all --oneline --decorate --graph :
* 81cb43f (HEAD, master) 2013-03-19T10:56:43,057198000-0400
* 34ea848 (remrepo/master) 2013-03-19T10:56:42,360743000-0400
git log --all --oneline --decorate --graph :
* e60b993 (HEAD, master) Merge branch 'master' of /tmp/gittest/remrepo
|\
| * 2326793 2013-03-19T10:56:42,838038000-0400
* | 81cb43f 2013-03-19T10:56:43,057198000-0400
|/
* 34ea848 (remrepo/master) 2013-03-19T10:56:42,360743000-0400
上記の出力からわかるように、
- 最後のフェッチ + マージ シーケンスは、の出力には影響しません。
git log... git mergeコマンドの出力はですがAlready up-to-date.、そうではありません (リモートリポジトリとローカルリポジトリはそれぞれ 1 つのコミットで分岐しています)。- この「マージ」の後、ローカル ブランチ (
master) はトラッキング ブランチ (remrepo/master) より 1 つコミットが進んでいます。 - フェッチ + マージ シーケンスとは対照的に、両方のコマンド セットがまったく同じ情報を受け取ったとしても、プルは正しいことを行います (つまり、トラッキング ブランチを更新し、マージを実行します)。