git学习笔记。
git是啥?clone,add,commit,push 无限循环。。。😂 🐶
本文提到的git指令
git status
git checkout – { filename }
git restore { filename }
git reset HEAD { filename }
git restore –staged { filename }
git reset {commitId | HEAD} –hard
git reset { commitId | HEAD} –soft
git switch
git merge
git pull
git push
git stash
怎么知道文件处于什么状态?
使用git status
可以查看文件分类,每个分类中可以查看文件状态。
- 未跟踪的文件
- 此时文件不管怎么变化都是 ??未跟踪的状态。
- 尚未暂存以备提交的变更 (已经进入暂存区的文件,又发生了变化,是相对于此时暂存区的中文件的状态,这些新的修改还并未进入暂存区)
- 被删除的状态 D
- 被修改的状态 M
- 要提交的变更 (已经存入暂存区,暂存区中的状态是相对于上次commit的)
- 被删除的状态 D
- 被修改的状态 M
- 新建文件的状态 A
当文件处于暂存区,被用户修改后怎么撤销修改?
- 使用
git checkout -- filename
将文件恢复到最近一次执行git add filename
后的状态。 - 使用
git restore filename
也能达到同样的效果。
当文件已经被存入暂存区,怎么移出暂存区?
- 使用
git reset HEAD filename
将文件从暂存区移除
- 处于修改、删除状态的文件会进入尚未暂存已备提交的变更分类,仍然是修改、删除状态。
- 处于新建文件状态的文件,会进入未跟踪文件的分类。
- 使用
git restore --staged filename
和上面的效果一样
想要回退到过去的commit怎么办?
1 | # 回退一步 |
–hard
- 不加
--hard
- 返回到对应版本后,可以使用
git status
或git diff
查看对应版本与回退前版本的差异 - 会保留当前暂存区,和工作区的修改,全部进入工作区。
- 返回到对应版本后,可以使用
- 加
--hard
- 返回对应版本后,执行
git status
可以发现此时工作区是干净的。 - 不会会保留当前暂存区,和工作区的修改。
- 返回对应版本后,执行
总结:如果当前工作区,暂存区还有为提交的代码,就别加--hard
。如果不想要这些代码了,想直接回到指定版本得到干净的工作区,就加上--hard
。
注意,加上
--hard
后暂存区和工作区的修改不能被找回。
回退后,后悔了怎么办
- 使用
git reflog
查看提交回退历史。从中找到对应的commitID - 使用
git reset commitID
本地冲突处理
将其它分之合并到master时
当我们执行git switch -c dev
创建一个新分支后。在dev
分之修改、添加、删除同一个文件。回到master做相同的操作。使dev
和master
分支都比开始时多几个提交。然后在master
分支执行git merge dev
会出现冲突
- 第一种,打开提示冲突的文件,处理冲突代码,然后执行
git add
和git commit
合并完毕。 - 第二种,直接执行
git merge --abort
中断合并。
在线冲突处理
github上创建一个空项目,A和B都将项目clone下来,分别commit一次提交并且推送到github。
当A推送(push)后,B再推送时会出现
1 | 提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。 |
此时执行git pull
会报错
1 | fatal: 拒绝合并无关的历史 |
这时候就要执行git pull origin master --allow-unrelated-histories
–allow-unrelated-history
默认情况下,git mergecommand 拒绝合并不共享共同祖先的历史。当合并两个独立开始的项目的历史时,此选项可用于覆盖此安全性。由于这是一种非常罕见的情况,默认情况下不存在启用此功能的配置变量,也不会添加。
https://git-scm.com/docs/git-pull#Documentation/git-pull.txt---allow-unrelated-histories
然后就是常规的合并流程。
当A和B都从github上clone相同的项目,有相同的祖先历史。B比A多出一次提交,A编写代码但没有提交
当A执行拉取(pull)后,会出现。
1 | 更新 5ed0c79(本地最新commitId)..47cd406(github上拉取的最新commitId) |
解决这种情况可以用两种方式
- 第一种,保存工作区
执行git stash
将未提交的代码存入stash中
然后执行git pull
将最新的commit拉取下来(这里默认github上最新commit与本地的commit本身没有冲突)
执行成功后,执行git stash apply
将之前未提交的代码从stash中取出,如果有冲突,就会报错接下来就是常规的冲突处理流程1
2自动合并 index.html
冲突(内容):合并冲突于 index.html - 第二种,将未提交的代码提交,然后在拉取(pull)最新commit
然后执行常规冲突处理流程即可。
!!! info
处理stash造成的冲突时,如果想取消这次stash,需要先执行git restore --staged .
,再执行git restore .
。
git push后发现提交的代码写的有问题
把代码改一改,再提交一次,如果提交错了好几版。
git reset commitId --soft
- 修改好代码,不要提交
git reflog
查看是从哪一个commitId回退过来的。git reset commitId --soft
- 然后再提交上传