GIT 学习

158 阅读15分钟
  1. SSH 如何创建SSH , 如何查看现有SSH。
  2. git 知识。 workspace 工作区 stage 暂存区 repository 仓库区 本地仓库 remote 远程仓库。
  • git clone 从远程仓库拉取代码到本地仓库。包括分支信息等等
  • git checkout 从本地仓库,切换分支到 workspace工作区. 切换分支
  • git pull 从远程仓库拉取代码到workspace工作区。
  • git add 本地修改添加到 暂存区 stage 区。
  • git commit 把本地修改提交到本地仓库 repository。
  • git push 把代码提交到远程。 串行逻辑。
  1. 一般通过 git clone 拉取远程代码到工作区workspace 就是本地文件夹相当于工作区。
  2. 然后 通过 git checkout切换分支(分支切换,但是本地工作区是同一个文件夹)。编辑代码。当完成一点需求之后,需要提交代码。
  3. 先通过 git add 把代码提交到 暂存区stage。
  4. 下一步通过git commit 命令把代码提交到 本地仓库。
  5. 最后通过 git push 把代码提交到远程仓库没完成代码提交。
特殊情况 1.

如果再修改代码之前,远程已经有人提交了代码。咱们一般需要通过 git pull 拉取远程代码到本地仓库和工作区。然后再编写代码重复 上述步骤。

特殊情况 2.

如果你在编写代码过程中。 还没提交呢。其他人在你的分支提交了代码。这个时候的操作。可以分为两种。

  1. 第一步 先尝试 拉取远程代码。 git pull . 如果没有冲突。就可以顺利拉取下来合并到本地代码的工作区里面。此时 后续操作就和 上面的一样了。
  2. 如果 git pull 拉取失败。代表远程代码和本地代码可能有冲突存在(也有可能不存在冲突,只是远程和本地修改的同一个文件等原因造成git pull 失败。)。此时需要 处理方式 也有两种。
  • 2.1 第一种方式: 可以把代码 先 git add、git commit 到本地仓库区。然后再 git pull 拉取远程。 此步骤 有可能造成 冲突。此时需要手动解决冲突。 然后再 git add 代码 git commit 、 git push 推送代码。(这种方式解释就是本地和远程都有修改,拉取远程失败的时候,可以先把本地的代码提交到本地仓库。再拉取代码)
  • 2.2 第二种方式: 可以把本地修改代码先暂存到 堆栈区(也有人叫暂存区、但是此暂存区不是上述介绍的那个暂存区,而是另外一处存储区)。通过 git stash 命令把本地修改,先放到堆栈区存起来。 再通过 git pull 拉取远程代码到本地。 在通过 git stash apply + 名字 把上一步暂存的代码 再恢复回来, 此时如果有冲突。去解决冲突。如果没有冲突最好。解决完冲突后。在通过上述步骤提交代码到远程。

解决冲突的 git 命令行,后面介绍 , 一般解决冲突的时候,都通过工具去解决。 以上两种方式。 最好用第二种。 因为 第一种方式,如果你先行git add和git commit 了 。再去 git pull 拉取远程,如果此时有冲突发生。 你解决完冲突之后。再推送到远程。 再git 记录上。别人此次提交的代码 也被标注为你提交的了。操作类似于 你开了个分支 把你俩代码开个分支 ,然后又合并到原分支。从提交记录上看会多出来一条线。

  • 我们在开发中,经常性实际发生的事为。 我改完代码。 没注意别人已经提交过代码了。 我就直接 git add 、git commit 、 git push 了。 此时 一推送远程 报错了。此时你本地代码就在 git commit 后的 状态。 此时最好办法是 把本地仓库的提交恢复。但是我还不会,只能是 git pull 拉取远程,然后冲突了。解决冲突。再去提交代码。 这样会造成 在此次提交之后, 别人提的代码也标记为你的了。 而且 此次提交相当于开了个分支, merge 过来的。 git 记录上会有一个分支 拉出去 再和回来。不友好。(source tree 操作的话。 git pull 冲突之后,如果冲突过多, 请不要在source tree 上 直接删除冲突的东西。妄想恢复一下。我重新来过。可能是因为merge的原因吧!我暂时不会。 走到这一步,就去解决冲突 ,提上去别妄想把这些都移除了。再去拉一边远程等想法。因为再拉不下来了。)

///// 现象 1. 远程有代码。 source tree 直接 push 代码。 会提示失败。但是本地代码走到了git commit 阶段。 再去拉取远程git pull 。 有冲突的话,会解决冲突。然后再提交。 此次提交采用的是 merge 。相当于 开了个分支 你俩代码 然后再何进到主流程,此时 别人提交的代码都会变为你提的内容。 如果解决 。暂时不会。

我现在会拉 哈哈哈。 如果有冲突会提示提交失败,此时代码在本地仓库。如果你去拉远程会冲突,形成merge 一样的分支。 此时 可以使用git reset 就是重置。将本次提交到本地仓库的代码 再重置回来。就和你提交前一样了。至于 git reset 重置有一些具体知识 在后面介绍。注意: source tree 上的操作是 选择那次提交(你提交到本地仓库之后,在git记录上就有这次提交记录了。)选择重置回来。

综上。 整理下初级的git 操作命令

git clone url
git clone [options] [url] [directory]

  • directory :为路径 可以不给。不给就是在当前路径下创建一个和远程仓库一样名字的文件夹接收仓库代码。可以给相对路径 也可以给绝对路径。给了路径后就不会创建和远程一样名字的文件夹了。
  • url:仓库地址。 SSH的和HTTPS的都可以。
  • [options]: 一些定制化参数。 我们主要了解 分支。 不写 默认主分支。main/之前是master。 -b branchName -b 加上分支名称。就会克隆出来分支。

git checkout

  • git checkout main 切换到一个已存在的分支
  • git checkout - b ranchName 创建一个新分支 并且切换到该分支下。

git pull: 拉取远程更改, 并且合并到本地分支。执行的是git fetchgit merge一起。把远程更改合并到本地仓库。

git pull [remote] [branch] remote 默认origin branch 默认当前分支

git add: 添加文件到 暂存区

  • git add 文件 文件 文件 可以添加多个文件 用空格 分开。
  • git add . 全部 修改 和增加的 文件 都添加到缓存区 但是不包括删除的文件。
  • git add --all / git add -A 包含了 git add . 并且还会把删除的文件 添加到缓存区。

git commit: 提交代码 到本地仓库 。并创建一次提交记录 git commit 命令用于将暂存区中的文件更改提交到本地仓库,并创建一个新的提交(commit)。提交包含了文件的更改以及相关的提交信息,如作者、日期和提交消息等。

git commit -m "提交消息"

也可以单独对某个文件 进行提交。 在 -m "" 后面跟这文件。默认是把暂存区统一打包处理。就是git add 的东西。 如果多次 git commit 最后统一 git push 也算多次提交。

git push: 把代码提交到远程。

介绍下 堆栈区

堆栈区 就是 stash 区。 这篇文章可以理解stash知识

堆栈区:我们可以把暂时未完成,还不行提到远程的代码。暂存到堆栈区里面。 然后切换分支去完成其他任务。再完成其他任务之后,再回到当前分支,使用之前存在堆栈区的代码释放出来之前编辑的code。

我们在堆栈区存的代码。不只能用于当前分支。这部分代码可以再任何分支里面解放出来去使用。

相关语法

这三个可以把 本地修改的代码 缓存到堆栈区。 -m 是描述信息。

  1. git stash push -m "message"
  2. git stash -m "message" 这俩一样的。记一个简单的
  3. git stash save "" 将要废弃

存储起来之后,应用堆栈区代码的方式

  1. git stash pop 将最近保存在堆栈的code 应用到当前工作区。并且删除最近的缓存
  2. git stash apply 将最近保存在堆栈的code 应用到当前工作区,保留最近的缓存
  3. git stash pop stashName 都可以在后面 加上空格和名字。 指定应用某一缓存
  4. git stash apply stashName 但是要注意。 这个name 并不是上一步的 那个 -m 。而是git 默认给起的名字。 我还可以告诉你 这个stashName 格式为 stash@{0} 这个0 就是index。

所以 综上基础知识。 我们不考虑合并分支的情况下。正确的使用git 最佳顺序为。

  1. 先 git pull 拉取远程代码。

  2. 如果顺利拉取远程代码。就 依次执行 git add .(git add -A 有删除的情况下) 、git commit -m "" 、 git push 。提交成功代码。

  3. 如果拉取远程代码失败。 不要 git add . 。 直接 git stash -m "message" 把代码存在堆栈区。好处不介绍了。看完上面都懂。

  4. 再执行 git pull 拉取远程代码。

  5. 再 执行 git stash apply stash@{0} 把存的应用出来。

  6. 如果有冲突。解决冲突。 通过 git status 可以查看文件状态。前缀是 UU 的代表 是冲突文件。<< >> == 这种冲突解决方法应该都知道吧。 XIB 没办法。取一方。另外一方适配去。改掉冲突代码之后,执行 git add [文件名] 就可以把该文件标记为 已解决。

  7. 之后 继续 git add . 、 git commit -m "message" 、 git push . 提交代码。

  8. git reset 重置命令行

回滚 + 重置 + 移除某次提交 + cherry up

回滚 是指将代码回滚到某次提交状态。其结果态是最终分支上得到的代码是指你要回滚选择的那次提交的代码。 如果你选择跨过几次提交,选择中间的某次提交,选择回滚到此次提交。最终代码是会丢失中间的提交。只是单纯的保留着回滚到的节点的代码。注意 *** 我上述说的是最终代码状态。并不是说操作完回滚后,git上的提交记录就没有了。他还是会有提交记录的。举个例子。 我有个分支, 一共有10个提交节点。 然后我选择倒数第五个节点选择回滚。 并不是回滚完成后 原本的第六次到第十次提交commit 节点记录没了。 回滚的表现为 我选择回滚到第五条节点。我会创建一次提交记录。相当于我有了个第十一条记录提交。提交完毕后的代码和第五条的时候的代码一致。其原本的第六到第十次提交记录都在。会出现一个Revert 的commit提交记录。这种方式不会改变提交历史,而是在提交历史中添加了一个新的提交。由于本人使用的source tree 选择回滚的时候没有其他可以选项的。只能直接选择回滚,然后 自动把代码提交到了本地仓库。没有办法自主修改提交备注。此时可以git reset 重置掉这次提交。在自己提上去。

  1. git revert 1和2 是一个效果 都是回滚最新一次提交
  2. git revert HEAD
  3. git revert 回滚到某次提交
  4. git revert --no-edit HEAD 这个是指回滚 不带提交信息。1 2 回滚的时候 终端会让你输入commit的 3
  5. git revert --no-edit 不携带提交信息 直接回滚到某次提交
  6. git revert --no-edit 同4 一样效果,都是回滚最新一次提交
  7. git revert -n

重置 git reset

重置的最终表现是 把分支上 提交的记录commit 都取消掉。然后把这些提交记录都恢复到本地代码(再重置的时候 直接把远程的几次提交代码的整合返回到本地,不是返回到本地仓库。本地和本地仓库 有区别。本地是指修改区,本地仓库是指 执行过了 git add 和 git commit 之后的代码状态。)并且此时 注意了。 只是执行了 git reset , 重置。并不是直接就把远程的几次提交commit给直接退回来了消失了。不是这样子的。 此时远程的那几次提交还都在。 就形成了远程有代码,本地有修改的状态。 此时状态下 ,source tree 会出现。 拉取远程会报错。不管是使用merger 还是使用 rebase 去拉取都会报错。所以如果选择重置到某次提交之后。本地有重置到这次提交的代码。远程就会出现一个远程代码。导致本地和远程不一致了。 视觉上 就想到于你本地改了代码。 但是别人往远程提交了代码。但是注意*** 本质不是一样的。此时 一定切记不要做的操作

1.把本地代码提交到本地仓库中。这一步提上去就没有办法在修改了。最好办法也是删掉分支,再重新拉取一下该分支, 重头再来过。 2.把本地代码都忽略掉。 这一步切记不要做,如果这么做了。最好解决办法,直接把分支删了。 再重新拉一个这个分支,重新操作。 3.去拉取代码。这一步都会报错

所以 重置的时候 会出现 远程和本地不一致状态。 此时 需要你去抉择。 因为你想重置,就是 不要这个过程中的代码。 此时 可以直接强推 git push -f . 就会完成本地重置, 这样此时就重置到了这次提交。

综上: 重置的最佳步骤是 。

  1. 先选择一个阶段, 执行 重置。

  2. 执行完重置后。 会出现 本地有修改。远程也有未拉取的状态。

  3. 此时千万不要本地的修改。不要慌。 不要遇到这种情况。提也提不上去, 拉也拉不下来都是报错。 就最好都不要动, 如果你已经 先把本地出现的代码删掉了。那么就删掉这个分支 重新再拉取一下这个分支吧。就是切到别的分支, 选择你要重置的那个分支 选择删除, 不要删除远程。然后再去下边 找到分支 ,检出回来。 如果你把本地的代码提到本地仓库了。 看着我说的是本地仓库, 因为你提到远程会报错。此时 就算你提到本地仓库了 也可以。

  4. 如果你没有动本地的代码 并且 没提交到本地仓库。 此时。 因为我们选择重置功能。 我们此时 有俩选项,这也是 重置的俩个主要功能。 此时 远程和本地不一致。 我们本地重置到的那次提交。 而远程是最新的那次提交。 此时 需要 把本地强推到远程。 让远程也和本地一样的状态。重置的选择的那次提交。 然后此时 存在本地的代码就是 选择重置的那次提交到最新提交的所有代码的改动。 强推 git push -f . 同步本地和远程状态。保持一致。然后此时本地的修改就是之前很多次提交的整合。此时 可以选择把他们直接忽略掉。就回到这次提交。也达到了回滚的效果。然后这种效果不好。 会丢失很多提交记录。我们已经有了回滚。 回滚是在原来的提交基础上 再做一次提交。恢复到某次提交。这样所有提交的记录都会保存 。比较好。 所以这个重置 去做回滚不咋好。

  5. 还有个场景, 我们此时 本地 有的修改是 选择重置的那次提交 到最新提交的 所有代码整合。如果我们再提上去 不就恢复了代码了吗? 有人说 费劲重置过来。再提回去做什么?神经病吖。 😄。 它的功能是 把 很多次提交 压缩为一次提交。这个效果就可以达到了。

  6. 最后我们 重置是会丢掉提交记录的, 所以在执行重置操作的时候。切记最好备份一个分支防止丢掉代码。

重置 git reset 的时候 有几种选项 需要了解 。

软重置( 混合重置 硬重置(Hard Reset) 重置的三种方式。 软重置和 混合重置。 再重置执行完毕 本地的修改 以及 重置到本次提交的代码都会保留到本地去。不会丢失。 硬重置 ,直接重置到那次提交。 至于本地的修改 和 重置到那次提交的所有修改都会被丢掉。 对应source tree 也是三种。 硬重置没必要。 想要硬重置 完全可以再强推之后 忽略本地修改。 git reset HEAD 重置提交到本地仓库的 提交 。 很好用。 应用场景。 当代码直接提交 远程有人提交代码的时候 会报错, 但是 代码已经在 本地仓库了。 你要是直接拉去远程 就是merge 了。 可以退回来。 暂存之后再去拉取。 也可以直接选择rebase 去拉取。 好像使用reabse 去拉取更好一些。 就是选择拉取的时候 有个选择 再source tree 上。 选择用变基代替合并方式 rebase 去拉取。