前言
本文主要是学习和记录在工作中经常用到的一些Git命令。这里推荐几个练习和学习Git命令的网站:
目录
一、基础必读
Git是什么
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git是一个免费和开源的分布式版本控制系统,致力于高效和快速的处理任何小或者大的项目。
Git中的几个概念
工作区、暂存区、版本库
- 工作区:就是在电脑里能够看到的目录,存放项目的文件夹。
- 暂存区:是在版本库
.git目录下的index文件,称为stage(或者叫index)的暂存区。 - 版本库:工作区有一个隐藏目录
.git,就是Git的版本库,主要存放暂存区和分支,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
三者的关系如下图:

git add 命令把文件修改从工作目录添加到暂存区,git commit 命令把暂存区的所有内容提交到版本库当前分支。

文件状态
如果我们想看一下工作区和暂存区文件的状态,可以使用命令 git status,
Changes to be committed:暂存区的文件。Changes not staged for commit:工作区的文件,还未保存到暂存区。Untracked files:指那些第一次创建,还没有加入版本更新的文件。
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。
分支
分支是多人协作开发中必不可少的角色,因为在我们的开发过程中,至少会有两个分支:
- 正式版本的分支:线上代码版本保存的分支,需要稳定的运行。
- 开发主线的分支:下个版本需求的开发分支。
- Bug分支:修复Bug的分支。
二、基础命令
暂存区相关
添加进暂存区
1 | $ git add . # 添加全部文件 |
撤销工作区的修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
1 | $ git checkout -- <file> # 把工作区指定文件的修改全部撤销 |
这里有两种情况:
一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是file已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
撤销暂存区的修改
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
1 | $ git reset HEAD <file> # 把暂存区的修改撤销掉(unstage),重新放回工作区 |
版本库相关
提交到版本库
1 | $ git commit -m <message> # message描述提交信息 |
撤销提交
在没有上传到远程分支时,进行版本库的撤销。
1 | $ git reset HEAD~1 # HEAD 代表当前的头结点,HEAD~n 代表当前节点的前n个节点 |
查看改动
1 | $ git diff HEAD -- <file> # 比较当前工作区和上一个版本的差异 |
删除文件
直接在文件管理器中把文件删了,或者执行rm命令。
1 | $ rm file # 仅从工作区删除文件 |
在Git中删除也是一个修改操作,要想从版本库中删除文件,需执行两步。
1 | $ git rm <file> # 从工作区删除文件并add到了暂存区 |
Branch
查看分支
1 | $ git branch # 查看本地所有分支,*是当前分支 |
创建分支
1 | $ git branch <name> # name 分支名 |
在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致,使用:
1 | $ git checkout -b branch-name origin/branch-name |
切换分支
1 | $ git checkout <name> # 切换到name分支 或者 git switch <name> |
合并分支
合并保留之前的提交顺序。
1 | $ git merge <name> # 合并分支name到当前分支 |
得到的提交历史更加线性,看着更加简洁。
1 | $ git rebase <name> # 合并分支name到当前分支 |
删除分支
1 | $ git branch -d <name> # 删除name分支 |
三、远程命令
查看远程库信息
远程仓库的默认名称是origin。
1 | $ git remote -v # -v 查看详细信息 |
更新代码
拉取最新代码
1 | $ git pull <origin> <branch-name> # origin是我们远程分支的别名 |
上传代码
1 | $ git push <origin> <branch-name> # 推送到指定分支 |
在上面的更新/推送命令中,默认了远程仓库的分支和当前的分支名一致,比如 git push origin master,本地分支名和远程分支的名称都为 master,如果不一致,则需要给定名称。
1 | $ git push/pull <origin> <本地分支:远程分支> |
进阶命令
追加更新
更新上次 commit 的代码,避免再次生成一个 commit 记录。
1 | $ git commit --amend |
关联远程分支
建立本地分支和远程分支的关联。
1 | $ git branch --set-upstream branch-name origin/branch-name |
上一个版本
指定当前版本的上一个版本,比如想在 master 分支上一个版本的基础上对代码进行修改,我可以输入 git checkout -b bugfix master^。
1 | HEAD^ |
工作现场暂存和恢复
1 | $ git stash # 把当前工作现场“储藏”起来,等以后恢复现场后继续工作 |
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
复制一个特定的提交到当前分支
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
1 | $ git cherry-pick <commit> # commit 某次提交 |
总结
Git命令暂时先学习这些,掌握了这些可以胜任平时的开发,对于一些复杂的命令,使用的时候再查。
引用文章: