掌握这些就算会git了

256 阅读4分钟

首先推荐这个网站, 可以看到各命令下分支的变动情况: learngitbranching.js.org/?locale=zh_…

工作区&暂存区&本地仓库之间的操作

git在本机上有这么3块区域, 正常的工作流为:

工作区 -1-> 暂存区 -2-> 本地仓库

其中1的命令为git add, 而2的命令为git commit.

暂存区位于中间, 它要么跟工作区相同, 要么跟本地仓库相同.

如果想撤回工作区的修改, 让工作区的内容和本地仓库的HEAD版本一致, 可以使用以下命令:

git checkout -- filename

不过这样暂存区的改动不会被撤回, 所以在此命令之前, 最好先执行

git reset HEAD (filename)

来撤销暂存区的变动.

分支管理

创建新的分支:

git branch branchname

切换当前分支(即变动HEAD指针位置):

git checkout branchname
git checkout HEAD^^
git checkout hashvalue~3

有些时候我们在某一个分支的工作还未做完, 还不想git commit, 但是却需要切换到另一个分支, 这时可使用git stash命令.

git stash # 贮存工作区和暂存区的变动
git stash pop # 恢复上一次的贮存内容

分支指针回退:

git reset HEAD~n

这个命令的含义是, 把当前分支的指针向回移动n个版本, 并把暂存区的变动撤销. 这样下来, 工作区就是新版本的内容, 本地仓库就是指针移动之后的旧版本的内容.

在多人协作时, 主分支指针回退会使得其他开发者无法找到上游版本, 这时如果想把某一次提交的变动"去除"掉, 需要以下命令:

git revert hashvalue

这个命令通过提交新commit的方式实现"去除"某次commit的变动, 不会导致上述问题.

分支合并

分支合并主要有2种方式, 分别为git mergegit rebase.

git merge意为融合, git merge branch1会把branch1融合到当前分支, branch1指针位置不变.

git rebase意为变基, 即变更分支附着点. git rebase branch1会把当前分支的附着点重置为branch1, branch1指针位置不变.

敲这两个命令时, 我觉得应该注意2点:

  1. 这两个命令都是有可能引发冲突的
  2. 如果分不清分支是怎么移动, 可以记住: 这两个命令branch1参数代表的分支位置不变

远程仓库

git还有一个重要的功能, 就是远程仓库的管理, 以便于多人协作.

克隆分支:

git clone <u>url</u>

将远程分支同步到本地:

git pull

将本地分支同步到远程:

git push

由于多人协作需通过切合分支来实现, 所以是有可能发生冲突的.

另一方面, 当你合分支的时候主分支不一定是你切分支时的状态, 所以需要事先同步远程仓库到本地.

使用git merge的方法:

git fetch
git merge o/master
# 处理可能的冲突
git push

简化版:

git pull
# 处理可能的冲突
git push

使用git rebase的方法:

git fetch
git rebase o/master
# 处理可能的冲突
git push

简化版:

git pull --rebase
# 处理可能的冲突
git push

关于git的多用户配置

当本机只需要以一个身份和远程仓库联系时, 仅需要下面的步骤, 来配置用户名, 邮箱和ssh密钥.

git config --global user.name "xxx"
git config --global user.email "xxx@xxx.com"
ssh-keygen -t rsa -C "xxx@xxx.com"

然而当本机需要不止一个身份时, 比如说github&gitlab, 那就需要好好配置一下了.

首先看密钥的配置, 密钥这边需要配置~/.ssh/config文件, 格式如下:

Host github.com
User xxx1
Hostname github.com
IdentityFile ~/.ssh/id_rsa_xxx1

Host gitlab.com
User xxx2
Hostname gitlab.com
IdentityFile ~/.ssh/id_rsa_xxx2

生成密钥时要注意使用的邮箱不同, 而且还需要更改默认的id_rsa文件名以对两种情况做区别.

然后看用户名和邮箱的配置, 我是先设置了全局用户名和邮箱, 比如说设置github的用户名和邮箱为全局的.

接着, 当使用gitlab的仓库时, 首先进行局部的用户名和邮箱配置, 可以把这个设置为别名:

# ~/.bashrc
alias github-user="git config user.name 'xxx2'; git config user.email 'xxx2@xxx2.com'"

这样在第一次使用gitlab仓库时, 执行github-user即可.