注:この質問の動機は、理解を深めることgit
であり、特定の問題を解決することではありません。IOW、「同じことを達成する」ための別の方法(つまり、タイトルの質問を回避する)は要点から外れます。
コマンド
git pull
...シーケンスと同等であると想定されています
git fetch
git merge
(つまり、リモートとそこからプルするブランチの明示的な引数を使用して)は、に続く?git pull <REMOTE> <BRANCH>
の同様のシーケンスに分解できます。fetch
merge
fetch
その部分は単純だと思います
git fetch <REMOTE> <BRANCH>
...しかし、もしそうなら、私はそれに続く正しいことがわかりませんgit merge ...
.
私は「明らかな」ことを試しました。たとえば、 を実行すると、ブランチ間のgit branch -r
出力リストが表示されるので、 を試しましたが、 で応答し、 を試行する前と同じコミットのままであることを示しています。これを確認するために、次のようにandを への呼び出しで囲みました。<REMOTE>/<BRANCH>
git merge -m 'some message' <REMOTE>/<BRANCH>
git
Already up-to-date.
git-log
HEAD
git merge
git 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 つコミットが進んでいます。 - フェッチ + マージ シーケンスとは対照的に、両方のコマンド セットがまったく同じ情報を受け取ったとしても、プルは正しいことを行います (つまり、トラッキング ブランチを更新し、マージを実行します)。