Git 代码管理(代码提交和代码回退)

Git的主要功能是代码管理,版本管理,分支管理。

在远程代码管理平台上,项目的代码被管理在一个远程代码仓库中,在本地,代码保存在一个本地代码仓库中。通过Git,本地对代码进行修改后,可以提交到远程代码仓库,当远程的代码被他人修改后,也可以拉取代码到本地。

一、工作区、暂存区和仓库区

将代码从远程代码仓库中拉到本地仓库后,本地仓库的代码与远程仓库的最新代码保持一致。这时候可以在本地仓库中对代码进行修改。修改代码之后,需要按步骤将代码提交并推到远程仓库,要理解这个过程,就要知道工作区、暂存区和仓库区。

当不得不回退/回滚代码时,对工作区、暂存区、仓库区的理解更是重要。

工作区、暂存区、仓库区是虚拟的概念,并不是物理上有三个独立的空间,其实相当于是代码提交的三个阶段。

工作区:开发人员增加、修改、删除代码/文件时,都是在工作区中进行的。工作区有两个状态很重要,修改前(拉取代码后没有做任何修改)和修改后(确定修改内容并保存)。

暂存区:是开发人员完成部分功能后将代码和文件暂存的区域。工作区的代码完成后,必须先经过暂存区才能提交。这个区域的代码会生成版本,不过提交后版本就没有了。

仓库区:是开发人员完成阶段性的功能后将代码提交的区域,这个区域的代码每次提交都有版本号(版本号很重要),可以用于查看版本和回退版本。暂存区的代码,必须要经过仓库区才能推到远程仓库。

二、工作区、暂存区、仓库区和远程仓库的关系

一开始从远程仓库中拉取最新代码,代码保存在本地仓库中,开发人员还没有对代码做任何的修改,所以代码处于工作区未修改状态。

对代码修改、增加、删除后,保存代码,此时代码仍然在工作区,现在处于修改后的状态。

使用 git add . 将修改后的代码添加到暂存区。

使用 git commit -m "提交信息" 将暂存区的代码提交到仓库区,每次提交都有对应的版本号。

使用 git push 将代码从本地仓库区推到远程代码仓库上。

每一个步骤都可以支持回退/回滚。

修改后的代码要回退到修改前,使用 git checkout file。新增加的文件要回到修改前,直接rm file。

暂存区、仓库区、远程仓库的代码回退/回滚都可以使用 git reset 来实现,根据版本号指定回退的版本,HEAD 或 commit-id。

git reset 有三个参数:

--hard 会将代码回退到修改前的状态,就相当于上次拉完代码的状态。所有增加、修改、删除的内容都不在了。(这个操作要慎重)

--mixed 会将代码回退到修改后的状态,可以再次对代码增加、修改、删除,保存,添加到暂存区,提交到仓库区。

--soft 会将代码回退到暂存区,可以继续往前回退,也可以重新提交到仓库区。

如果代码已经推到了远程仓库,reset 回滚后重新推代码时,一定要加 --force 或 -f 参数,才能将本地仓库的版本覆盖远程仓库的代码,避免代码冲突。(这个操作也要慎重,要与团队做好沟通,否则会把其他人的代码也覆盖了)

三、Git代码管理(提交和回退)

本文中,有一个叫 GitProject 的项目代码托管在 Github 上,在 Windows 本地已经配置好了本地代码仓库,这个项目是一个新建的项目,里面没有任何代码(只有一个 README 文件)。

1. 右键打开 Git Bash , 进入本地代码的目录中,为了方便练习 git 的使用,我先创建了一个 git.py 文件,写了几行代码,然后将代码推到了远程仓库,下面的步骤基于这次提交的代码来做修改。

编写代码可以使用任何您喜欢的方式,各种编辑器、IDE都可以,比如用vi写好后wq保存退出。不管用什么方式,代码都是处于工作区,都可以保存代码然后按步骤提交代码。

2. 确认分支和拉取代码

不管任何时候,在开始修改代码之前,都记得先做两步操作。

第一,先看当前处于哪个分支上,当前 GitProject 项目还只有一个分支 master ,所以用的是 master 。

在实际的工作中,代码的分支会非常多,大的项目活跃的分支可能10几个,还有很多不常用的分支。而且,实际工作中是不会直接在mster分支上修改和调试代码的,都是先在其他分支测试通过之后,才会合入到master分支。

所以第一步先看当前分支是不是自己要修改代码的分支,如果不是先切换,否则改了很多代码发现改错分支了,很麻烦。

# 查看当前分支
git branch
# 查看所有分支
git branch -a
# 切换分支
git checkout master
# 如果分支是在远程仓库创建的,可以这样获取
git fetch origin

第二步,git pull 拉取当前最新的代码,如果不是最新的代码,修改代码后向远程仓库提交时,会造成代码冲突。

# 拉取最新代码
git pull

做好以上两步,基本可以避免大部分的代码回退问题和代码冲突问题。

确认好分支是最新代码后,在git.py中进行开发(增加一行代码),然后保存。

3. 修改代码和取消修改

在修改代码前,使用 git status查看当前的状态,代码提示的是 nothing to commit,修改并保存后,git.py 的名字变成了红色,当前 git.py 处于工作区已修改的状态。

如果现在保存的代码不想要了,可以用 git checkout file 使代码回到修改之前,所有修改的内容都不会保存,如果是一个新增加的文件,可以使用 rm file 直接删除文件,回到修改前。

# 查看当前代码状态
git status
# 修改后回退到修改前
git checkout git.py

4. 查看修改内容

修改并保存代码后,可以使用 git diff 查看修改的内容。

# 查看修改的代码内容
git diff

5. add添加代码和回退

代码处于工作区修改后的状态,可以使用 git add file 或 git add . 将代码添加到暂存区。git add file 是添加指定的文件,

git add . 是将整个工作区中保存了的内容都添加到暂存区。

# 添加git.py到暂存区
git add git.py
# 添加所有已修改代码到暂存区
git add .

代码添加到暂存区后,使用 git status 查看到当前的状态,git.py 的名字变成了绿色,说明当前代码处于暂存区。

如果不想继续提交代码,将代码回退到前面的状态,可以使用 git reset HEAD git.py 回退到工作区修改后的状态。

其中,git reset 是所有操作过程中都可以使用的回退命令,后面接要回退的文件名,不指定文件则回退所有的修改。

HEAD 表示当前的版本,当前版本可以省略,HEAD~ 或 HEAD^ 表示当前版本的上一个版本,后面可以接多个~或^,也可以接数字。如HEAD~~~表示当前版本往前数的第3个版本,HEAD~5表示当前版本往前数的第5个版本。

git reset 后还有三个参数, --soft回退到暂存区,--mixed回退到工作区修改后的状态,--mixed可以省略不写,--hard回退到修改之前的状态。

所以 git reset 、 git reset git.py 、 git reset HEAD git.py 和 git reset --mixed HEAD git.py 一样,都是将 git.py 回退到当前版本的修改后状态。

# 回退代码到工作区修改后
git reset --mixed HEAD git.py

6. commit提交代码和回退

代码处于暂存区时,可以使用 git commit -m "提交信息" 来将代码提交到仓库区。

如果代码处于工作区,也可以使用 git commit -am "提交信息" 将代码从工作区提交到仓库区,相当于 git add 和 git commit 命令合并成一条命令,两步操作合并了。

# 提交代码
git commit -m "add print**"

提交代码后,代码处于待 git push 的状态,现在 git status 已经不显示被修改的 git.py 了。

一旦 git commit ,代码就立即生成一个新的版本号,要回退就是上一个版本了。

如果代码已经 git cmmit 提交,想要回退,可以使用 git reset --soft HEAD~ 来将代码回退到暂存区。可以使用 git reset HEAD~ 或 git reset --mixed HEAD~ 回退到工作区修改之后, 可以使用 git reset --hard HEAD~ 回到工作区修改代码前。

# 回退代码到暂存区
git reset --soft HEAD~

7. push推代码到远程仓库

在本地仓库区的代码,使用 git push origin 分支名 将代码推到远程仓库中,也可以直接 git push ,但建议还是跟上分支名。

# 将代码推到远程仓库
git push origin master

8. 查看远程仓库

到远程仓库查看,现在的 GitProject 项目有三次提交(前两次分别是新建项目,创建git.py文件),第三次提交的信息为 add print**, 正是我们刚才提交过来的代码,说明代码已经被推到了远程仓库。

9. 回退提交到远程仓库的代码

如果代码已经推到了远程仓库,但是发现代码有问题,需要将代码回滚,还是可以使用 git reset 来回滚代码。

回退到的位置依然是根据版本和 --soft --mixed --hard 三个参数来定位,回退的命令与前面的相同。

10. 重新提交回退的代码

现在将代码回退到了暂存区,现在的状态是待提交状态。

也可以回退到工作区进行修改,重新提交代码,然后推代码到远程仓库。

现在远程仓库的代码是第三次提交后的代码,本地代码回退了第三次提交,相当于是第二次提交之后的状态。在第二次提交的基础上重新提交,次数还是第三次。

远程已经有了三次提交,又要推另一个第三次提交,这会造成冲突问题,无法推成功。所以,在推代码的时候要加上 --force 或 -f ,表示将本地回退后重新提交的代码覆盖远程仓库的提交。

# 提交并覆盖远程仓库
git push origin master --force

11. 重新提交后,远程仓库的提交次数还是3次,但是提交信息已经改变了。说明上次提交到远程仓库的代码已经被覆盖了。

上面所有的回退操作中,版本号都可以通过 HEAD 来确定版本的。

每次 commit 提交都会生成一个唯一的 commit-id,要找到指定的版本,也可以使用 git log 或 git reflog 来查看提交过的 commit-id ,然后通过 commit-id 来指定版本。

git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录,git log 则不能察看已经删除了的commit记录。

回退命令:

# 回退到指定版本
git reset --hard commit-id

在工作中,更安全更常用的回退代码方式是 Revert ,Revert 操作会生成一个新的 commit-id ,然后将 Revert 操作提交,就回退了代码。如果回退掉的代码又要 Merged 进来,可以再次 Revert,又生成一个新的 commit-id,然后提交。

使用 Revert 进行的每一次操作,都会有对应的 commit-id,并且 Revert 不会对其他人的代码造成影响,所以更适用。

Git 代码管理(代码提交和代码回退)相关推荐

  1. git提交后push中出现之前的提交的代码或者其他人提交的代码

    git提交后push中出现之前的提交的代码或者其他人提交的代码 问题现象 1.项目最外层目录的pom.xml文件,右键输入git reset --mixed HEAD~7指令,撤销commit的全部内 ...

  2. Git—代码管理、提交及冲突解决流程的思考

    1 代码管理   Git不多说,大家都知道这是一个分布式版本控制系统,对开发者而言,可以敏捷高效的进行代码管理及开发,也非常适合多人协作.话不多说,下面就来点干货. 1.1 创建新仓库   我们在工作 ...

  3. Windows环境下通过Git来管理自己的Android代码

    前面已经介绍了在Windows下使用git工具来下载Android的源代码,Windows环境下通过Git得到Android源代码,这里记录我使用git工具来管理我自己的代码,git是一种分布式的项目 ...

  4. git clone 某次提交前代码_git提交代码常用命令

    1.在网页上fork中心仓到自己私有仓 2.本地clone自己的私有仓:git clone 自己的私有仓地址 3.本地添加中心仓分支地址: git remote add upstream ssh:// ...

  5. 单主机上,多个Git用户,同时提交下载代码的配置

    ==========0. 公私钥准备========== [root@host-10-57-72-19 ~]#  chmod 600 /root/.ssh/sun_id_rsa.pub [root@h ...

  6. git如何把分支提交的代码同步到另一个分支(git cherry-pick)

    实际场景 在多版本项目开发中,大家应该经常会遇到需要把最新版本上开发的代码,同步到历史的版本中,或者是在发版后发现了问题,在最新版代码上解决了该问题,同时也需要把以前有问题的版本给解决掉,再把解决过的 ...

  7. 代码管理工具知多少?来看看Git怎么用吧

    一. 代码管理工具简介 说到代码工具,许多工作了的小伙伴一定很有发言权.因为我们在实际开发环境中,就代码的复杂度和逻辑度,对于开发工程师来说,都是极具挑战性的.如果单靠个人来完成单个项目的整体开发,那 ...

  8. 代码管理平台——svn、git、github、gitlab

    2019独角兽企业重金招聘Python工程师标准>>> 代码管理平台 一.代码管理平台介绍 版本控制,记录若干文件内容变化,以便将来查阅特定版本修订情况 版本管理工具发展史:cvs- ...

  9. 代码管理和版本管理的作业流程以及规范是怎样的?

    代码管理和版本管理的作业流程以及规范是怎样的? 代码管理和版本管理的作业流程以及规范是怎样的?下面以文档的形式进行详细分析,希望能够给予测试人员一些帮助和指导. 本文目的 本文试图提供一套有效进行代码 ...

最新文章

  1. 工作八年总结(转载)
  2. pytorch 吸烟检测yolov5s
  3. Android插件化开发之DexClassLoader动态加载dex、jar小Demo
  4. 前端学习(1704):前端系列javascript之问题解答2和总结
  5. json字符串生成C#实体类的工具
  6. 专访雷果国:从1.5K到18K 一个程序员的5年成长之路
  7. 第一章 QT Creator 简介
  8. 那一天我们许下约定(组合数学,DP)
  9. B站签约冯提莫,能否靠直播业务实现年入一百亿目标?
  10. linux系统支持ntfs吗,linux支持NTFS
  11. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...
  12. 从零基础转行到前端大牛,需要经过哪几个阶段?
  13. 网络批量后修改服务器,企业网络批量安装服务器搭建案例
  14. 力扣-118 杨辉三角
  15. web安全day6:IIS之WEB服务器
  16. python爬取2017年统计用区划代码和城乡划分代码(截止2017年10月31日)
  17. 2021年最新3d材质贴图素材大合集来咯
  18. java数据结构与算法之栈(Stack)设计与实现
  19. 清除显卡右键菜单批处理.bat
  20. ol3中妙用Arcgis Server Rest Export接口模拟WMS,并实现属性过滤

热门文章

  1. 这些深度学习术语,你了解多少?(上)
  2. 聊聊FilterSecurityInterceptor
  3. 《基于模型的软件开发》——1.2 结构化开发
  4. TRex 学习(3) -- stateful ( detail )
  5. 《TensorFlow技术解析与实战》——第3章 可视化TensorFlow
  6. 如何从rpm包中提取文件
  7. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 角色权限的配置页面改进优化...
  8. 结构设计模式 - 代理设计模式
  9. RFI to RCE challenge
  10. css overflow: scroll 去滚动条后,低端手机有兼容问题,可以这样