首先推荐这个网站, 可以看到各命令下分支的变动情况: 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 merge和git rebase.
git merge意为融合, git merge branch1会把branch1融合到当前分支, branch1指针位置不变.
git rebase意为变基, 即变更分支附着点. git rebase branch1会把当前分支的附着点重置为branch1, branch1指针位置不变.
敲这两个命令时, 我觉得应该注意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即可.