如何解决我如何不在 git 中将对文件所做的更改从一个分支转移到另一个分支
我有一项家庭作业,需要对同一个程序进行三种不同的植入。教授建议使用 git 并将每次植入都放在不同的分支中。事实是,当我在名为 A 的分支上进行更改时,它也会修改主分支中的同一个文件......我不希望它在每个分支上进行我的更改,而是将更改保存在本地每个分支单独。我该怎么做?
(我刚开始使用 git) (我们在 linux,一个远程服务器,在终端上工作)
编辑:我用来创建项目目录的命令:
git init
git commit -m "my message"
git checkout // to switch branches
git branch branchname // to create a branch
解决方法
当我这样做时:
$ git init
Initialized empty Git repository in MyPath/Test1/.git/
然后我创建一个文件 test.txt
$ touch test.txt
$ git add test.txt
$ git commit -m " commit 1 "
现在我想在不同的分支中修改它
$ git checkout -b branch1
$ echo "Branch 1" >> test.txt
这是棘手的部分......
如果我不使用 git add test.txt
添加文件并且我不提交但直接转至母版:
$ git checkout master
Switched to branch 'master'
M test.txt
我会在 master
中看到修改!!:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.txt
我应该做的是 add
和 commit
在 branch1 中:
$ git checkout branch1
$ git add test.txt
$ git commit -m "commit from branch 1"
[branch1 1b562f5] commit from branch 1
1 file changed,1 insertion(+)
$ git log
commit 1b562f5be40a50df04f8a2a15b58a7af61742275 (HEAD -> branch1)
Author: xxxxxx<xxxxx.xxxx.xxx@xxxx.com>
Date: Thu Jun 3 16:36:30 2021 +0200
commit from branch 1
commit 03684e2a02c1a37a8f4546f296c6802686c7a4e9 (master)
Author: xxxx<xxx.xx.xx@xxxx.com>
Date: Thu Jun 3 16:31:05 2021 +0200
commit 1
如果我回到 master
并查看日志:
$ git checkout master
Switched to branch 'master'
$ git log
commit 03684e2a02c1a37a8f4546f296c6802686c7a4e9 (HEAD -> master)
Author: xxxxx<xxxxx.xxxx.xxxxx@xxxx.com>
Date: Thu Jun 3 16:31:05 2021 +0200
commit 1
我们不会看到修改......正如预期的
所以!如果你想在其他分支上工作,即使你还没有完成当前分支怎么办?
我回到 branch1 并cat
它的内容
$ git checkout branch1
Switched to branch 'branch1'
$ cat test.txt
Branch 1
继续编辑
$ echo "Branch 1..1" >> test.txt
让add
而不是commit
并尝试checkout
掌握
$ git add test.txt
$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
test.txt
Please commit your changes or stash them before you switch branches.
Aborting
不可能!你必须commit
之前,但是!您不希望每次更改分支时都进行新的提交,因此您只需 commit --amend
$ git commit --amend
$ git log
commit 40a3a66e2b45a253f9a6ed564e977887c0748bf0 (HEAD -> branch1)
Author: xxxxx<xxxxx.xxxxx.xxxxx@xxxxx.com>
Date: Thu Jun 3 16:36:30 2021 +0200
commit from branch 1 => I can edit the comment!!
commit 03684e2a02c1a37a8f4546f296c6802686c7a4e9 (master)
Author: xxxxx<xxxxx.xxxxx.xxxxx@xxxxx.com>
Date: Thu Jun 3 16:31:05 2021 +0200
commit 1
现在我可以安全地git checkout master
您在工作树中看到和编辑的文件(普通文件)实际上并不在 Git 中。当您运行 git checkout
(或新的 git switch
)时,它们是从 Git 中复制出来的;它们都为此特定目的执行相同的操作;添加了 git switch
在 Git 2.23 中作为一种更安全的结帐方式)。
当您运行 git add
和 git commit
时,您将创建一个新快照,将您的所有文件存档在 Git 中。每个提交都拥有每个文件的完整快照(嗯,它拥有的每个文件的完整快照,但这听起来有点多余,不是吗?)。 这些文件存储在 Git 中,以特殊的、只读的、Git 专用的、压缩的和去重形式存储在每次提交中。
重复数据删除处理这样一个事实,即大多数提交大多只是重新使用以前提交的现有文件。如果文件没有重复数据删除,它可以使存储库比实际情况更小。但这也意味着使用存储在 Git 中的文件实际上是不可能的。因此,当您运行 git checkout
或 git switch
时,当您从一个提交移动到另一个提交时,Git 会删除旧的检出文件并替换它们 使用新选择的提交中的新提交。
为了避免丢失未保存的工作,git checkout
和git switch
都先做一些安全检查。1如果你修改了某个文件,但尚未提交该修改,Git 会尝试将修改后的文件带入新分支。这并不总是可能的,但如果可行,您会看到您所看到的:
Switched to branch 'master'
M test.txt
这个 M
是 Git 的表达方式:嘿,我注意到你修改了 test.txt
。我能够将分支切换到 master
并将修改后的文件副本留在您的工作树中,而不仅仅是破坏您所做的更改。我没有从 master
中取出副本。如果这不是您想要做的,您可能应该切换回另一个分支,添加文件并提交。
实际上还有很多其他内容 - 包括 Git 何时以及是否可以切换分支 - 我对 Checkout another branch when there are uncommitted changes on the current branch 的回答中有一个更完整的故事。这是关于为什么有时可以,有时不能git checkout
另一个分支而不提交工作的问题的答案。它没有解决 git checkout
不如 git switch
安全的事实——问题本身,以及我的回答,早于新的 git switch
——并且不是关于这是否是一个好主意。这只是关于底层机制。
现在,请记住您看到和处理的文件不在 Git 中。它们在您的工作树中,供您查看和处理,但就 Git 而言,它们只是临时文件,供您使用并让 Git 使用 {{1 }}。
1git checkout
中的安全检查可以被禁用,有时您没有意识到。这就是为什么 git checkout
现在存在以及为什么转换为它是一个好主意,但旧的 git switch
仍然有效的原因。由于您在问题中提到了它,因此我主要在此处的示例中使用 git checkout
。另外,我已经使用 Git 大约 15 年了,并且从过去的坏习惯中养成了坏习惯。 :-)
您在使用 forks
吗?
奇怪的是,master 分支会自动与另一个分支同步。我知道,如果你创建了一个 fork,那么它可以配置为来自 origin 的 master 分支与你的 fork 中的 master 分支同步。
基本上,您在另一个分支中的更改不应自动推送到主分支,除非您合并了您的分支。
你会添加更多细节吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。