gpt4 book ai didi

git 在多个分支之间暂存和提交

转载 作者:IT王子 更新时间:2023-10-29 00:54:13 26 4
gpt4 key购买 nike

我显然根本不了解 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
$

这显然与 git pro 书中的这一点相矛盾:

记住这一点很重要:Git 会重置您的工作目录,使其看起来像您 checkout 的分支指向的提交快照。它会自动添加、删除和修改文件,以确保您的工作副本是您上次提交时分支的样子。

最佳答案

当您添加 一个文件时,您在哪个分支并不重要,只有当您提交 它时才重要。所以如果你这样做:

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)。让我们创建新分支:

$ 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 分支,我们将看到没有第二行的文件的早期版本:

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

对文件的更改与提交它们的分支隔离。

在您更新的示例中,这...

$ git checkout master

...不会产生错误,因为此时,masterfire 中“one”的版本是相同的。工作目录中的更改同样适用于任一版本。

关于git 在多个分支之间暂存和提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com