微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何不在 git 中将对文件所做的更改从一个分支转移到另一个分支

如何解决我如何不在 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

我应该做的是 addcommit 在 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 addgit commit 时,您将创建一个快照,将您的所有文件存档在 Git 中。每个提交都拥有每个文件的完整快照(嗯,它拥有的每个文件的完整快照,但这听起来有点多余,不是吗?)。 这些文件存储在 Git 中,以特殊的、只读的、Git 专用的、压缩的和去重形式存储在每次提交中。

重复数据删除处理这样一个事实,即大多数提交大多只是重新使用以前提交的现有文件。如果文件没有重复数据删除,它可以使存储库比实际情况更小。但这也意味着使用存储在 Git 中的文件实际上是不可能的。因此,当您运行 git checkoutgit switch 时,当您从一个提交移动到另一个提交时,Git 会删除旧的检出文件并替换它们 使用新选择的提交中的新提交。

为了避免丢失未保存的工作git checkoutgit 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 举报,一经查实,本站将立刻删除。