写在前面
软件多人开发,难免遇到版本控制问题。小项目开发时,使用三板斧
可以
git pull
git add .
git commit -m "message"
git push origin master
遇到大点的项目,处理冲突、代码丢失分分钟让人头秃。我就是在一次提交中误使用了git stash
,代码丢失,找回来的过程也是一言难尽。
于是,我决定重新整理一下git操作,方便后续控制版本。
基本原则
代码写好后,任何git操作前,先进行三部曲: git status -> git add . -> git commit
。
命令分析
git status
在说文件状态之前,先了解一下git的流程。如下图所示, git中有三个区:
- 工作区
Working Tree
:就是你写代码的目录区 - 暂存区
Index/Cache
:git add
后的文件所在区 - 本地仓库
Repository
:git commit
后的文件所在区
根据操作不同,使用git版本控制的文件主要有3种状态:
- untracked files:本地新新增的文件,只存在工作区中;
- changes to be commited:
git add
后,工作区和暂存区中都有,提示你去commit; - changed not stated for commit:
git add
后,但是在本地又做了修改或删除,但是没有commit。
git log && git log --oneline
超高频操作。查看当前分支的提交历史(commit)。配上不同的参数可以过滤不同的结果。
最常用的是--oneline
参数,log历史会一行显示。
git add && git commit
超高频操作,这2步就是把工作区的文件保存到本地仓库中,commit过的代码不会意外丢失。
git stash
将当前的工作区内容保存到Git栈中,此时工作区中没有文件了。这个操作使用需谨慎,容易发生丢失。
git rebase
把一个分支的修改合并到当前分支。
常规情景
刚接收到任务
-
git clone: 从远端仓库拉取代码
-
git checkout -b new-branch: 创建一个新分支(这里假设新分支的名字是new-branch)
-
写代码
-
git add . && git commit -m "xxx": 每当写完一个模块或功能后,记得保存到本地仓库,防丢失
-
代码开发完成了,
5.1. git status: 查看所有代码是否都保存,如果没有继续git add && git commit
5.2. git log --oneline: 查看当前分支下的commit信息
5.3. git rebase: 合并commit信息
-
git push origin new-branch: 把本地仓库推到远端
开发一半时,需要远端最新代码
- git status: 查看所有代码是否都保存,如果没有继续git add && git commit
- git pull --rebase origin master:将远端主分支master以rebase的形式合并到当前分支
- 继续写代码
开发一半时,需要其他分支的某个commit的代码
- git status: 查看所有代码是否都保存,如果没有继续git add && git commit
- git log --online other-branch: 查看所需分支的commit记录,记下需要commit的hash值hash-XXX
- git cherry-pick hash-XXX: 复制到当前分支
异常处理
应该在develop分支上开发,结果忘记切换分支,在master上开发了
- git stash save "save message": 先把代码临时保存到git栈中,此时工作区没有文件。
- git switch develop: 切换到目的分支
- git stash list: 查看栈中有过哪些临时存储
- git stash pop [stash@{1}]: 把文件从git栈中恢复,如果不加参考默认第一个