16

私は明らかにgitをまったく理解していません。これは私が得ているものです:

git branch  (outputs that I'm on master)
git checkout -b foo
echo "next line" >> file (file is an existing file)
git add file (stages)
git checkout master
git status (shows that file has "next line" and is staged!!)
git commit (commits the changes that were staged on branch foo!!)
git checkout foo

これがキッカーです。fooは、作業ディレクトリまたはステージングされたファイルに加えられた変更を表示しなくなりました。

つまり、ファイルの変更やステージングなど、行った変更はすべてすべてのブランチに適用されます。また、特定のブランチにコミットすると、コミットしたブランチを除く他のすべてのブランチでそれらの変更が破棄されます。

これは実際に何が起こっているのですか?誰かがこれを私に理解させることができますか?それは完全に厄介な振る舞いのように聞こえます、そして明らかに私はこれを賢明なことにするデザインのアイデアを理解していません。

明示的な例を編集します。

$ mkdir element
$ cd element
$ git init
Initialized empty Git repository in /home/dan/element/.git/
$ echo "one" >> one
$ git add one
$ git commit -m msg
[master (root-commit) 36dc8b0] msg
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 one
$ git checkout -b fire
Switched to a new branch 'fire'
$ echo "next line" >> one
$ git checkout master
M       one
Switched to branch 'master'
$ cat one
one
next line
$

これは、gitproの本から明らかに矛盾しています:

This is an important point to remember: Git resets your working directory to look like the snapshot of the commit that the branch you check out points to. It adds, removes, and modifies files automatically to make sure your working copy is what the branch looked like on your last commit to it.

4

2 に答える 2

14

ファイルを追加するときにどのブランチにいるのかは関係ありません。それをコミットするときだけです。したがって、これを行う場合:

git add file
git checkout master
git commit

ファイルを master ブランチにコミットしました。

出力付きの完全な例を次に示します。新しいリポジトリから始めます。

$ git init
Initialized empty Git repository in /home/lars/tmp/so/repo/.git/

この時点で、私たちはmasterブランチにいて、まだファイルを追加していません。ファイルを追加しましょう:

$ date > file1
$ cat file1
Fri May 11 13:05:59 EDT 2012
$ git add file1
$ git commit -m 'added a file'
[master (root-commit) b0764b9] added a file
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 file1

masterこれで、1 つのコミットを持つブランチ ( ) が作成されました。新しいブランチを作成しましょう:

$ git checkout -b foo
Switched to a new branch 'foo'
$ git branch
* foo
  master
$ ls
file1

に行を追加しますfile1

$ date >> file1
$ git status
# On branch foo
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   file1
#
no changes added to commit (use "git add" and/or "git commit -a")

これは、ファイルが変更されているが、まだステージングされていないことを示しています。ファイルをステージングしてコミットしましょう。

$ git add file1
$ git commit -m 'made a change'
[foo 761bed9] made a change
 1 files changed, 1 insertions(+), 0 deletions(-)

そして再実行git status

$ git status
# On branch foo
nothing to commit (working directory clean)

この時点で、ファイルは次のようになります。

Fri May 11 13:05:59 EDT 2012
Fri May 11 13:07:36 EDT 2012

ブランチに戻るとmaster、2 行目のない以前のバージョンのファイルが表示されます。

$ git checkout master
Switched to branch 'master'
$ cat file1
Fri May 11 13:05:59 EDT 2012

ファイルへの変更は、コミットされたブランチに分離されます。

あなたの更新された例では、これは...

$ git checkout master

...この時点では、両方の「1」のバージョンが同一であるため、エラーは生成されませmasterfire。作業ディレクトリの変更は、どちらのバージョンにも同様に適用されます。

于 2012-05-11T17:11:57.317 に答える