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可以查看文件分类,每个分类中可以查看文件状态。

  1. 未跟踪的文件
  • 此时文件不管怎么变化都是 ??未跟踪的状态。
  1. 尚未暂存以备提交的变更 (已经进入暂存区的文件,又发生了变化,是相对于此时暂存区的中文件的状态,这些新的修改还并未进入暂存区
  • 被删除的状态 D
  • 被修改的状态 M
  1. 要提交的变更 (已经存入暂存区,暂存区中的状态是相对于上次commit的)
  • 被删除的状态 D
  • 被修改的状态 M
  • 新建文件的状态 A

当文件处于暂存区,被用户修改后怎么撤销修改?

  1. 使用git checkout -- filename将文件恢复到最近一次执行git add filename后的状态。
  2. 使用git restore filename也能达到同样的效果。

当文件已经被存入暂存区,怎么移出暂存区?

  1. 使用git reset HEAD filename将文件从暂存区移除
  • 处于修改、删除状态的文件会进入尚未暂存已备提交的变更分类,仍然是修改、删除状态。
  • 处于新建文件状态的文件,会进入未跟踪文件的分类。
  1. 使用git restore --staged filename和上面的效果一样

想要回退到过去的commit怎么办?

1
2
3
4
5
6
7
8
9
10
11
# 回退一步
git reset HEAD^

# 回退三步
git reset HEAD^^^

# 回退一百步
git reset HEAD~100

# 根据具体commit ID回退
git reset commitID

–hard

  • 不加 --hard
    • 返回到对应版本后,可以使用git statusgit diff查看对应版本与回退前版本的差异
    • 会保留当前暂存区,和工作区的修改,全部进入工作区
  • --hard
    • 返回对应版本后,执行git status可以发现此时工作区是干净的。
    • 不会会保留当前暂存区,和工作区的修改。

总结:如果当前工作区,暂存区还有为提交的代码,就别加--hard。如果不想要这些代码了,想直接回到指定版本得到干净的工作区,就加上--hard

注意,加上--hard后暂存区和工作区的修改不能被找回。

回退后,后悔了怎么办

  1. 使用git reflog查看提交回退历史。从中找到对应的commitID
  2. 使用git reset commitID

本地冲突处理

将其它分之合并到master时

当我们执行git switch -c dev创建一个新分支后。在dev分之修改、添加、删除同一个文件。回到master做相同的操作。使devmaster分支都比开始时多几个提交。然后在master分支执行git merge dev会出现冲突

  1. 第一种,打开提示冲突的文件,处理冲突代码,然后执行git addgit commit合并完毕。
  2. 第二种,直接执行git merge --abort中断合并。

在线冲突处理

github上创建一个空项目,A和B都将项目clone下来,分别commit一次提交并且推送到github。

当A推送(push)后,B再推送时会出现

1
2
提示:更新被拒绝,因为您当前分支的最新提交落后于其对应的远程分支。
提示:再次推送前,先与远程变更合并(如 'git pull ...')

此时执行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
2
3
4
5
更新 5ed0c79(本地最新commitId)..47cd406(github上拉取的最新commitId)
error: 您对下列文件的本地修改将被合并操作覆盖:
index.html
请在合并前提交或贮藏您的修改。
正在终止

解决这种情况可以用两种方式

  1. 第一种,保存工作区
    执行 git stash将未提交的代码存入stash中
    然后执行git pull将最新的commit拉取下来(这里默认github上最新commit与本地的commit本身没有冲突)
    执行成功后,执行git stash apply将之前未提交的代码从stash中取出,如果有冲突,就会报错
    1
    2
    自动合并 index.html
    冲突(内容):合并冲突于 index.html
    接下来就是常规的冲突处理流程
  2. 第二种,将未提交的代码提交,然后在拉取(pull)最新commit
    然后执行常规冲突处理流程即可。

!!! info
处理stash造成的冲突时,如果想取消这次stash,需要先执行git restore --staged .,再执行git restore .

git push后发现提交的代码写的有问题

把代码改一改,再提交一次,如果提交错了好几版。

  1. git reset commitId --soft
  2. 修改好代码,不要提交
  3. git reflog 查看是从哪一个commitId回退过来的。
  4. git reset commitId --soft
  5. 然后再提交上传