Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 将现有文件移动到另一个分支,并将此文件的新版本置于master_Git - Fatal编程技术网

Git 将现有文件移动到另一个分支,并将此文件的新版本置于master

Git 将现有文件移动到另一个分支,并将此文件的新版本置于master,git,Git,我有一个文件Main.java和它的两个版本:一个版本位于我的本地和远程存储库中,位于branch master上。第二个版本位于另一台计算机中,从未跟踪其中的更改 我需要使第二个文件成为主版本,同时将第一个版本移动到新的分支 考虑到git从来不知道第二个版本,而且其中的更改也从未以任何形式提交过,我不知道如何实现它。任何git存储库中的所有提交都包含文件的快照。每次提交都会保存其保存的所有文件的完整快照 也就是说,将您的Git存储库视为提交的集合(因为它是这样的),每个提交都以某种向后的方式串

我有一个文件
Main.java
和它的两个版本:一个版本位于我的本地和远程存储库中,位于branch master上。第二个版本位于另一台计算机中,从未跟踪其中的更改

我需要使第二个文件成为主版本,同时将第一个版本移动到新的分支

考虑到git从来不知道第二个版本,而且其中的更改也从未以任何形式提交过,我不知道如何实现它。

任何git存储库中的所有提交都包含文件的快照。每次提交都会保存其保存的所有文件的完整快照

也就是说,将您的Git存储库视为提交的集合(因为它是这样的),每个提交都以某种向后的方式串在一起。让我们用三个提交来绘制一个非常简单的存储库,并将这些提交称为
a
B
、和
C
,以便于讨论它们:

A <-B <-C
这意味着commit
A
包含一些版本的
README.md
Main.java
。保存在commit
A
中的这些快照是只读的(并且经过压缩和Git化以节省空间并成为只读的)。关于提交
A
,任何事情都不能也永远不会改变:任何提交的所有部分都会一直冻结

这就是为什么
B
指向
A
,但是
A
也不指向
B
A
现在被冻结了。我们实际上还没有
B
。现在我们更改
Main.java
README.md
,或者创建一个全新的文件。所有这些更改根本不会发生在提交中:它们发生在我们的工作树中,Git提供给我们让我们完成工作。假设我们创建了一个新文件,
foo.doc
,以及
git add
it和
git commit
。这就是创建snapshot
B
:它有
README.md
——与snapshot
A
中的
README.md
版本相同的
Main.java
,与
A
中的相同,再加上新文件
foo.doc
。它还记住commit
A
的散列ID

然后我们做一些事情,制作
C
,它会记住
B
。这就是为什么我们会有这种向后看的承诺链。所有这些提交都将一直冻结。只要它们仍然存在,与它们一起保存的文件的版本(作为它们的快照)也会一直保存

您有一个
Main.java
,它根本不在这个存储库中。您可以将其复制到工作树中的适当位置,然后
git添加它并进行新的提交:

A--B--C--D
A--B--C   <-- hello
       \
        D   <-- master (HEAD)
D
将拥有新版本的
Main.java
。注意,commit
C
仍然存在,没有改变,一直处于冻结状态

这里唯一棘手的一点是:分支到底是什么?这些承诺“在”某些分支机构上意味着什么

答案是:分支名称是人们有时说“分支”时的意思之一,它包含一个提交的哈希ID。我们说分支名称指向该提交。让
master
指向
D

A--B--C--D   <-- master
任何提交中都没有任何更改!(我在新行上画了
D
,但这只是为了压缩我的箭头。)提交
a
D
现在在
master
上,提交
a
C
现在在
hello

您可以随时使用
git branch
命令创建和销毁分支名称,指向实际存在的任何提交。获取指向
C
hello
的简单方法是从指向
C
master
开始:

A--B--C   <-- hello
       \
        D   <-- master
A--B--C   <-- master
我们添加特殊名称
HEAD
,并将其附加到以下两个分支名称之一:

A--B--C   <-- master (HEAD), hello
我们只需要我们想要的。

任何Git存储库中的所有提交都会保存文件的快照。每次提交都会保存其保存的所有文件的完整快照

也就是说,将您的Git存储库视为提交的集合(因为它是这样的),每个提交都以某种向后的方式串在一起。让我们用三个提交来绘制一个非常简单的存储库,并将这些提交称为
a
B
、和
C
,以便于讨论它们:

A <-B <-C
这意味着commit
A
包含一些版本的
README.md
Main.java
。保存在commit
A
中的这些快照是只读的(并且经过压缩和Git化以节省空间并成为只读的)。关于提交
A
,任何事情都不能也永远不会改变:任何提交的所有部分都会一直冻结

这就是为什么
B
指向
A
,但是
A
也不指向
B
A
现在被冻结了。我们实际上还没有
B
。现在我们更改
Main.java
README.md
,或者创建一个全新的文件。所有这些更改根本不会发生在提交中:它们发生在我们的工作树中,Git提供给我们让我们完成工作。假设我们创建了一个新文件,
foo.doc
,以及
git add
it和
git commit
。这就是创建snapshot
B
:它有
README.md
——与snapshot
A
中的
README.md
版本相同的
Main.java
,与
A
中的相同,再加上新文件
foo.doc
。它还记住commit
A
的散列ID

然后我们做一些事情,制作
C
,它会记住
B
。这就是为什么我们会有这种向后看的承诺链。所有这些提交都将一直冻结。只要它们仍然存在,与它们一起保存的文件的版本(作为其快照)也将被保存
A--B--C   <-- hello
       \
        D   <-- master (HEAD)