本文是基于以下参考中的内容,结合个人使用体验进行创作的。
本文旨在讲解常用的git命令,在实际的开发过程中,大多会下载相关软件或插件辅助使用,图形化的界面可以大大降低学习难度,便捷的操作也能很好的提升开发体验,在Git的基本使用——Android Studio中的Git插件一文中有写git插件的常见使用方法。
Git 大全——非常详细的列出了git命令及其含义
Learn Git Branching ——模拟学习git分支
狂神说-B站视频——比较基础但很详细易懂的git视频
Git是分布式版本控制系统
Git Bash: Unix与Linux风格的命令行
Git CMD: Windows风格的命令行
GIT GUI: 图形操作界面
必须配置用户名和用户邮箱才能使用
git config --global user.name "zhang3"
git config --global user.email "[email protected]"
更改用户名
git config --global user.name "Li4"
# 全部
git config -l
#系统
git config --system --list
#本地:
git config --global --list
git config --global --add user.name "li4"
git config --global --add user.email "[email protected]"
git config --global --unset user.name "zhang3"
git config --global --unset user.email "[email protected]"
# 初始化一个本地仓库
git init
# 将该仓库与远端仓库建立连接
git remote add [远端仓库名] [项目对应的url]
远端仓库默认名称origin,但也可以给他们起别的名称
git clone [项目对应的url]
两个本体仓库也可以互相 clone,
但 push 的时候需要把远端本地仓库的HEAD detach掉,
或者将远端仓库的receive.denyCurrentBranch设置为ignore或warn
# 将当前目录下所有文件添加到缓存区
git add .
# 将缓存区中的文件提交到本地仓库
git commit -m "本次提交的备注"
提交备注:一般为本次修改内容
# 将当前branch推送到远程仓库同名分支,
git push
# 将当前branch推送到远程指定仓库指定分支,没有同名则自动新建
git push <远程仓库> <远程分支名>
如果再自己提交修改之前,有别的同事往该分支上提交过代码,可能会出现本地修改和远程仓库有冲突的情况,此时会push失败,需要先pull远程更改,在本地merge之后再push。
# 默认从远程拉取到本地同名分支下,没有同名则自动新建
git pull
# 从远程指定分支,拉取到本地指定分支,没有同名则自动新建
git pull <远程仓库> <远程分支名>:<本地分支名>
pull命令实际上包含了两步,等价于下面两行
# 从远程拉取
git fetch
# 将拉取到的修改与本地代码合并
git merge <远程仓库>/<远程分支名>
查看提交记录
git log
# 查看当前branch的文件状态
git status
# 所有文件
git status
# 指定文件
git status filename
某些文件不必纳入版本控制之中,例如:
数据库文件、临时文件、设计文件…
设置本机绑定SSH公钥,实现免密登录
ssh-keygen -t rsa #生成公钥和私钥,其中rsa为加密算法,可以根据自己的需要选择其他的加密算法
接下来会提示输入密码,直接回车就好,三次回车后即可完成。
此时在“C:\用户\当前用户名.ssh”文件夹中会生成两个文件,其中.pub后缀(取public之意)的就是公钥,另一个是私钥。
master分支应该用来发布稳定的版本。
# 新建一个分支
git branch branch_name
# 新建并切换到新分支
git checkout -b branch_name
# 删除分支
git branch -d branch_name
# 删除远程分支
git push origin -delete branch_name
git branch -dr branch_name
# 切换分支
git checkout branch_name
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
HEAD是一个标签,表示你正在所指向的该记录上工作。
HEAD一般指向当前分支的分支名,而当前分支点分支名一般指向当前分支上最近的一次提交记录。
修改提交树的过程中,常常要用到改变HEAD指向。
TAG也是一种标签,但设置后不可以更改指向,也不可以被HEAD指向。
用于设置持久标记,例如版本号。
将指定的commit移动到当前HEAD处
# 移动指定的一个commit
git cherry-pick <commit_id>
# 移动指定的N个commit
git cherry-pick <commit1_id> <commit2_id> ...
rebase,变基。基,是指当前操作的基础。
-i 表示interaction,是交互的意思
git rebase -i HEAD`3
git rebase -i <commit_id>
上述命令执行后,会打开vim编辑器,你可以自行调整提交记录顺序,或是执行合并、丢弃等操作。
编辑完成后保存退出,git会自行根据你的修改执行命令如果导致了冲突,
1.合并冲突
1).手动修改,2).使用add将修改内容添加到暂存区,3).使用git rebase --cotinue。
2.放弃变基
git rebase --abort ,放弃这次操作,回到之前的状态
3.跳过冲突
git rebase --skip ,跳过引起冲突的commits,跳过的记录会被丢弃掉,慎用。
初始状况
假设有两个分支,分别为稳定的master分支和修改了部分代码的bugFix分支
现在我们在master分支上,需要将bugFix分支合并进来
merge
将bugFix上的提交记录合并到当前分支上
git merge bugFix
rebase
c3原本是基于c1进行修改的,现在将其改为基于bugFix指向的c2进行修改。
于是将当前记录移动到bugFix下,此处的效果和cherry-pick效果相同
git rebase bugFix
思路:回退n个提交的记录
# 回退2个提交记录
git reset HEAD~2
# 回退到指定的提交记录,中间的文件差异会加入working tree
git reset <commit_id>
# 强制回退到指定的提交记录,并重置working tree,而中间的文件差异会消失
git reset --hard <commit_id>
reset和checkout都是移动HEAD,将其指向指定的记录,不同的是,reset会带着branch一起移动。
思路:增加一个刚好可以抵消上次修改记录的记录
git revert master
例如再远程主分支上有内容需要删除,
如果强行删除的话会导致删除部分记录丢失,
这样后期发现有问题需要排查时没有记录就很麻烦,
这种情况下,revert就是一个绝佳选项。