Discuss / Git / 我实在是看不下去了,一会儿暂存区一会儿版本库的

我实在是看不下去了,一会儿暂存区一会儿版本库的

Topic source

lmtooT_T

#1 Created at ... [Delete] [Delete and Lock User]

我实在是看不下去了,一会儿暂存区一会儿版本库的,请先分清概念,经过我的实验,提交代码的更改一共分2个阶段。

1).从工作目录,提交到stage。 2).从stage提交到master。

从工作目录提交到stage,需要用add或者rm命令,只提交到stage,而没有提交到master,是不会自动同步到master的。

从stage提交到master用commit命令。

退回也是要分两步,一个是从master退回到stage,然后再从stage退回到工作目录。

对于还没有提交到stage的,可以从stage用checkout命令退回,这一步会取stage中的文件状态,覆盖掉工作目录中文件的状态,跟master完全没关系。

对于已经到达stage的,想把state中的文件状态用master中的覆盖掉,就用reset命令,这样就把stage中修改用master的状态覆盖掉了,完全跟工作目录没关系

这个关系理得还清楚,老师讲得有点绕了

羲皇殿

#3 Created at ... [Delete] [Delete and Lock User]

1 说的也不清楚,应该还是要区分

假定HEAD版本为版本1

1、工作区你修改了,为 版本2 ,但没add,那么 checkout 就会使你工作区回到版本1 2、工作区你修改了,为版本2,add了,stage区也为版本2,然后你又修改了工作区,为版本3,没再次add,那么checkout就会使你stage区的版本2失效,理解为清空也行,但是工作区依然版本3

cleardusk

#4 Created at ... [Delete] [Delete and Lock User]

@lmtooT_T说的很正确。 经过简单的琢磨后,发现git命令的提示恰到好处。

$git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    LICENSE

no changes added to commit (use "git add" and/or "git commit -a")

细细思考,从这些提示(警告)中,可以看出,工作目录、stage、master是三种状态。工作目录->stage,使用git add/rm,stage->master(或者别的分支),使用git commit,回退的话,借助提示的信息其实足够了。

举 git rm 为例子。

在此插入代码
$git rm license
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    LICENSE

git rm 删除了工作目录的内容,也删除了stage的内容,只是没有同步到master中。回退的话,提示信息里有。 另外,git的所有命令都有自动补全的,帮助文档都是齐全的。 比如 man git rm。

廖老师可能绕了些,也许是太为了照顾初学者了。不管怎么说,只要从文章中获益,就是廖老师的贡献了。 :)

万事平和

#5 Created at ... [Delete] [Delete and Lock User]

“对于还没有提交到stage的,可以从stage用checkout命令退回,这一步会取stage中的文件状态,覆盖掉工作目录中文件的状态,跟master完全没关系。”

对于以上楼主这句话,我有话说。 自己都没整明白,还看不下去谁? 对于没提交到stage的修改; 删除后,重新恢复,修改的内容是会直接消失的; 比如你在文件中添加一个字符:‘1’; 不用git add file 添加到stage; 然后用rm删除后, 再用git checkout -- file恢复; 恢复过来后,去看文件是没有这个字符:‘1’的。

git checkout -- file恢复的是已经添加到stage的内容;

git rm删除的就是stage的内容; git reset HEAD -- file会从master中将被删的stage的内容拷贝过去;

如果你使用了git rm之后接着使用 git commit -m “remove file” 则会删除master里的内容;

利用git reset --hard HEAD^可以将删除的master从回收站恢复过来; 然后利用git reset HEAD -- file 从master中拷贝到stage中; 最后再用git checkout -- file 从stage中拷贝到工作目录中。

inline_block

#6 Created at ... [Delete] [Delete and Lock User]

有个疑问,我试过git reset --hard HEAD^直接这一句,就能在工作区里看到删除掉的文件,不知道下面那两句还有必要用吗?没感觉用不用有什么区别?求大神指点。。。

憬鹊绝跃

#7 Created at ... [Delete] [Delete and Lock User]

@lmtooT_T

我对你这回复也实在看不下去了, 不要误导人, 最后三句基本各种错误!

  1. master退回到stage; (有这种回退吗??? 哪个命令干这事的? reset? stage实际只是待提交的缓冲区. 实际的两种回退操作, 第一种: stage回退到工作目录, 是用来取消提交操作的; 第二种: master回退到工作目录, 是用来回滚操作的; )

  2. 对于还没有提交到stage的,可以从stage用checkout命令退回,这一步会取stage中的文件状态,覆盖掉工作目录中文件的状态,跟master完全没关系。 (逻辑上就有问题! 没有提交到stage, 怎么从stage检出? 实际是如果stage里有需要commit的内容, 用checkout会从stage检出覆盖工作目录文件; 但如果stage中没有需要commit的内容时, 会从master当前版本中检出, 跟maaster怎么没有关系?)

  3. 对于已经到达stage的,想把state中的文件状态用master中的覆盖掉,就用reset命令,这样就把stage中修改用master的状态覆盖掉了,完全跟工作目录没关系 (怎么可能根工作目录没有关系??? reset命令有两个作用. 第一: 移除stage中待commit的内容; 第二: 版本回滚, 捎带着stage中的内容清空; 语言逻辑混乱, 懒得挑错了都. )

个人认为应该把git add与git rm看成是相互对应的git命令。

git rm file的时候, if这个file已经commit了,系统会删除stage里的file,提示需要参数--cached 或者 -f ,其中--cached 参数会保留工作区文件;-f 参数会连同工作区的file一起删除。如果不带参数,默认是--cached。这个时候如果commit了,那么仓库里都会更新,方向是stage-->>仓库。

另一种情况,add过的file没有commit,仓库里没有那个file。那么git rm的时候,工作区和stage区里的文件都会删除。

THEKOC

#9 Created at ... [Delete] [Delete and Lock User]

test

THEKOC

#10 Created at ... [Delete] [Delete and Lock User]

@憬鹊绝跃

我对你这回复也实在看不下去了, 不要误导人, 最后三句基本各种错误!

master退回到stage;

(有这种回退吗??? 哪个命令干这事的? reset? stage实际只是待提交的缓冲区. 实际的两种回退操作, 第一种: stage回退到工作目录, 是用来取消提交操作的; 第二种: master回退到工作目录, 是用来回滚操作的; )

事实上的确有这种回退,并且用的就是 reset 指令,输入 git reset <commit> <file> 就可以从版本库回退到 stage,并且不会修改工作区的内容。

对于还没有提交到stage的,可以从stage用checkout命令退回,这一步会取stage中的文件状态,覆盖掉工作目录中文件的状态,跟master完全没关系。

(逻辑上就有问题! 没有提交到stage, 怎么从stage检出? 实际是如果stage里有需要commit的内容, 用checkout会从stage检出覆盖工作目录文件; 但如果stage中没有需要commit的内容时, 会从master当前版本中检出, 跟maaster怎么没有关系?)

逻辑上没问题,他是说工作区还未提交到 stage 的文件,可以恢复到暂存区的版本。如果 stage 中没有要 commit 的内容的话,那不是说明 master 的内容和 stage 的一样吗?这种情况我也可以说是从 stage 而不是 master 恢复的,从而就和 master 没关系了。

对于已经到达stage的,想把state中的文件状态用master中的覆盖掉,就用reset命令,这样就把stage中修改用master的状态覆盖掉了,完全跟工作目录没关系

(怎么可能根工作目录没有关系??? reset命令有两个作用. 第一: 移除stage中待commit的内容; 第二: 版本回滚, 捎带着stage中的内容清空; 语言逻辑混乱, 懒得挑错了都. )

可以和工作目录没关系的。reset 的不同参数有不同效果,如果是默认参数(也就是 --mixed)的话的确和工作区没有关系,这一点你可以自行实验。


  • 1
  • 2

Reply