2

*これは「これでいいの?」の 1 つです。私が本当に受け入れられる質問にフォーマットすることはできませんが....

私はまだ git、特にリモート ブランチとのマージに 100% 慣れているわけではありません。問題が発生した場合、またはマージの競合をあきらめたい場合は、通常、マージ/コミットをロールバックするのに苦労しています。いわば、うさぎの穴のさらに奥にいることに気づきます。リモートマージを実行するためだけにブランチを作成し、一時ブランチを「実際の」ブランチとローカルにマージする方が簡単でしょうか?このようにして、何か問題が発生した場合にいつでも一時ブランチを核にすることができます.

更新: リモート ブランチがリポジトリに大量のファイルを追加する時期に特に関心があります。例(以下のピーターの例を使用):

私はこれをします:

$ git init
Initialized empty Git repository in /path/to/repo/.git/
$ touch README
$ git add README
$ git commit -m 'Initial commit'
[master (root-commit) da9886d] Initial commit
 0 files changed
 create mode 100644 README
$ touch A
$ git add A
$ git commit -m 'Add A'
[master 3480a5b] Add A
 0 files changed
 create mode 100644 A
$ git push // pushed to remote (only a single file, A)

次に、別の開発者がこれを行います。

$ git clone
$ touch B
$ git add B
$ git commit -m 'Add B'
[foo 9912a23] Add B
 0 files changed
 create mode 100644 B
$ git push // pushed to remote (now has two files A and B)

私がこれを行う場合:

$ git pull

A と B の 2 つのファイルがあります。ここで、「一歩戻って」マージを元に戻したい場合は、次のようにします。

$ git reset --hard master@{...}

ファイル B は追跡されていないファイルとして私のマシンにまだ存在しますよね? git マージを行ったことがないかのように、これらのファイルを削除するにはどうすればよいですか?

これが、別のブランチを作成することを望んでいた理由です。マージを行うために別のブランチを作成する場合:

$ git checkout -b tempBranchForMerge
$ git pull

私はまだファイルAとBになりますが、それらはtempBranchForMergeにしか存在しません。問題が発生した場合、私はこれを行うことができるはずです:

$ git checkout master
$ git branch -d tempBranchForMerge

右?これにより、ファイル B が削除されます。

4

1 に答える 1

2

それはまったく問題ありませんが、不要です。

Git は、 でアクセスできるブランチの移動場所の履歴を既に追跡していますgit reflog。が特に好きgit reflog <branch name>です。

例を試してみましょう。この例をセットアップするだけの一連のコマンドを次に示します。とブランチがmasterあります。fooそれぞれに 1 つのコミットがあります。次に、 にマージfoomasterます。

$ git init
Initialized empty Git repository in /path/to/repo/.git/
$ touch README
$ git add README
$ git commit -m 'Initial commit'
[master (root-commit) da9886d] Initial commit
 0 files changed
 create mode 100644 README
$ touch A
$ git add A
$ git commit -m 'Add A'
[master 3480a5b] Add A
 0 files changed
 create mode 100644 A
$ git checkout -b foo HEAD~1
Switched to a new branch 'foo'
$ touch B
$ git add B
$ git commit -m 'Add B'
[foo 9912a23] Add B
 0 files changed
 create mode 100644 B
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
* 9912a23 (HEAD, foo) Add B
| * 3480a5b (master) Add A
|/
* da9886d Initial commit
$ git checkout master
Switched to branch 'master'
$ git merge foo
Merge made by the 'recursive' strategy.
 0 files changed
 create mode 100644 B
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
*   d4d06ce (HEAD, master) Merge branch 'foo'
|\
| * 9912a23 (foo) Add B
* | 3480a5b Add A
|/
* da9886d Initial commit

ここで、そのマージ コミットを元に戻したいとします。つまり、master をコミット前の状態に戻します。

$ git reflog master
d4d06ce master@{0}: merge foo: Merge made by the 'recursive' strategy.
3480a5b master@{1}: commit: Add A
da9886d master@{2}: commit (initial): Initial commit
$ git reset --hard master@{1}
HEAD is now at 3480a5b Add A
$ git log --decorate --graph --all --pretty=oneline --abbrev-commit
* 9912a23 (foo) Add B
| * 3480a5b (HEAD, master) Add A
|/
* da9886d Initial commit
于 2013-05-14T23:16:02.700 に答える