0%

Git入门指南

前言

本文主要是学习和记录在工作中经常用到的一些Git命令。这里推荐几个练习和学习Git命令的网站:

Learn Git Branching《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的过程

文件状态

如果我们想看一下工作区和暂存区文件的状态,可以使用命令 git status

  • Changes to be committed:暂存区的文件。
  • Changes not staged for commit:工作区的文件,还未保存到暂存区。
  • Untracked files:指那些第一次创建,还没有加入版本更新的文件。

对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。

分支

分支是多人协作开发中必不可少的角色,因为在我们的开发过程中,至少会有两个分支:

  • 正式版本的分支:线上代码版本保存的分支,需要稳定的运行。
  • 开发主线的分支:下个版本需求的开发分支。
  • Bug分支:修复Bug的分支。

二、基础命令

暂存区相关
添加进暂存区
1
2
$ git add .       # 添加全部文件
$ git add <file> # 添加某个文件
撤销工作区的修改

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

1
$ git checkout -- <file>  # 把工作区指定文件的修改全部撤销

这里有两种情况:

一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是file已经添加到暂存区后,又作了修改,现在撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit 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
2
$ git rm <file>  # 从工作区删除文件并add到了暂存区
$ git commit -m 'remove file' # 提交到版本库中
Branch
查看分支
1
$ git branch  # 查看本地所有分支,*是当前分支
创建分支
1
$ git branch <name>  # name 分支名

在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致,使用:

1
$ git checkout -b branch-name origin/branch-name
切换分支
1
2
$ git checkout <name>  # 切换到name分支 或者 git switch <name>
$ git checkout -b <name> # 创建并切换name分支 或者 git switch -c <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
2
3
HEAD^
分支^
Hash值^
工作现场暂存和恢复
1
2
$ git stash  # 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash pop # 恢复工作现场,同时把stash内容也删了

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

复制一个特定的提交到当前分支

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

1
$ git cherry-pick <commit>  # commit 某次提交

总结

Git命令暂时先学习这些,掌握了这些可以胜任平时的开发,对于一些复杂的命令,使用的时候再查。

引用文章:

《🛠Git 常用操作总结》
《关于Android Studio使用Git的总结》
《廖雪峰的Git教程》

《团队协作Git入门指南》