-
结构
工作区:位于本机,就是最底层的修改,直接的修改。一般的操作不需要git命令,只有与git有关的,如添加、删除文件跟踪(添加、删除文件到暂存区):
git add 文件名 、git rm 文件名(这只会删除追踪,不会删除本地工作区的文件)
需要git关键字。
每次有修改时,就要add,就像ctrl+s一样。
暂存区:保存了一些临时数据,等待提交到版本库中。具体哪些是临时数据,在工作区被git add的文件,但是还没有从git commit到版本库的文件就是临时数据。一般完成了某个功能后有一次commit。执行了commit后,其实暂存区还是有内容的,提交相当于复制。使用git ls-files 可以查看暂存区的内容。
版本库(本地仓库):就是.git文件,等待被push到远程仓库,一般多次commit后有一次push(大概一天一次吧)。使用git ls-tree --full-tree -r --name-only HEAD查看本地仓库的内容
远程仓库:这里有维持着很多分支,一个开发者只在其中一个分支上进行开发,也就是版本库只会push到其中一个分支,当该分支比较成熟,可以申请合并到master分支上。
-
redo与undo
1. 已 add 未 commit (从暂存区恢复一个文件到上一次commit。因为没有commit,那么当前head没有变化,原文件将永远找不回,最好对比区别后在操作):git checkout -- "文件名",你可以指定id来返回到指定commit
2. 1 已commit,还没有push(从本地仓库返回至某一版本),如果已经push,那么使用这种方法的话,只会改变本地的代码,远程仓库的是不会变的,当你修改后想提交就会发现提交不了(但是可以加-f强制提交,不推荐)。
- 返回上一个版本: git reset --hard HEAD^
- 返回到20个版本之前:git reset --hard HEAD~20
- 返回到指定id的版本:使用 git log 查看提交日志与Id,再使用 git reset --hard <SHA>来退回到指定版本
-
git reset
<SHA> :git reset
会保留工作目录。这样,本地提交记录是没有了,但是修改内容还在磁盘上。这是一种安全的选择,但通常我们会希望一步就“撤销”提交以及修改内容 — 这就是--hard
选项的功能。 - redo之后,进行了一些修改,又觉得不如之前的,想undo,这时候使用git log的话并不能显示redo之前的原始分支,而是需要使用git reflog显示一个
HEAD
发生改变的时间列表,然后再使用 git reset --hard <SHA>来返回到任意一个时间节点。
2.2. 合并本次与上次commit(修正上一次commit):git commit --amend
或 git commit --amend -m "Fixes bug #42"
3. push之后,回退到某一版本,这会利用一个新的commit来模拟反操作使远程仓库与本地工作区都回退到某一版本:git revert <SHA>
-
冲突
一个项目在多人协作,你和同事没有事先沟通,同时修改了一个文件,修改完成都要push.
这时就会出现一个问题:先push的人提交正常,后push的人会被警告存在冲突。
如果强制push,远端仓库会自动合并,保留出现冲突的内容(上一个版本和刚提交的内容都会被保留下来)。
这时代码将不能正常运行,其他同事在执行 pull 拉取新代码后会发现无法运行,这就给别人造成了很大的麻烦。
所以,在开发项目时如果是多人协同开发,那么提交代码时一定要先 pull,拉取远端仓库的最新版本,如果存在冲突,仔细校对,在本地处理好冲突内容后再执行 push 提交代码。
在commit之后,我们想提交的到了本地仓库,然后pull之后,合并的内容在工作区,如果没有冲突,则直接push,git就会自动合并远程仓库(合并后与此时的工作区一样),如果有冲突,则先对比工作区与本地仓库的区别,解决冲突,再commit,pull,(解决冲突),push。
-
其他
git diff:由于暂存区在commit之后,内容依然不变,所以git diff在任何时候都可以理解为比较工作区与暂存区的共同文件
git commit -m ‘注释’用于提交暂存区的文件;git commit -a或者git commit -a -m '注释'则相当于提交工作区中已被跟踪的文件,即对于已被跟踪的文件,如果之后它被修改了,不需要再次add也行。
参考:
转!!git如何撤销上一次commit(或已push) - 乌云de博客 - 博客园 (cnblogs.com)
如何在 Git 里撤销(几乎)任何操作和log、reflog、cherry-pick使用_钟长森的博客-CSDN博客
git回退到某个版本,以及从过去的版本返回到新的版本_DDD_QQQ的博客-CSDN博客_git 更新到某个版本
冲突:https://www.zhihu.com/question/60431222/answer/1695660194
git diff的最全最详细的4大主流用法_快乐李同学的博客-CSDN博客