Git常用命令总结
add
#提交修改和新建
git add .
#提交修改和删除
git add -u
#提交修改、新建、删除
git add -A
rm
#rm只能删除工作区
rm a.xtxt
#git rm可以同时删除工作区和暂存区
git rm a.txt
#rm后需要add后才能commit
rm a.txt
git add -A
git commit -m "xxx"
#git rm后直接commit即可
git rm a.txt
git commit -m "xxx"
mv
#重命名工作区的文件
mv old_file new_file
#同时重命名工作区和暂存区的文件
git mv old_file new_file
#mv后的提交
git add -A
git commit -m "message"
#git mv后的提交
git commit -m "message"
banch
#在当前位置创建分支
git branch <branch_name>
#在指定位置创建分支
git branch <branch_name> <position / commit>
#修改分支名的位置
git branch -f <branch_name> <commit>
commit
#git add之后进行commit
git commit -m "message"
#git add和commit合二为一,这种情况只适用于修改文件
git commit -am "message"
#--amend不增加新的提交
git commit --amend -m "message"
reset
git reset用于回退代码,具有三个参数--hard、--mixed、--soft。
revert
git reset只能回退本地代码,如果想回退远程代码,需要使用revert。
diff
#工作区和暂存区
git diff
#暂存区和版本库
git diff --cached
#工作区和版本库
git diff HEAD
blame
#查看文件每个部分的修改者
git blame <file>
log
#查看整个工程的提交记录
git log
#查看最近n次提交
git log -n
#查看指定文件的提交记录
git log <file>
#查看指定文件的提交记录,并显示差异
git log -p <file>
reflog
#查看所有分支的所有操作记录
git reflog
#利用reflog回到已经回退的记录
git reflog
git reset --hard hard
push
#常规做法
git push origin master : refs/for/master
#如果远程分支被省略,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push origin master
#如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
git push origin : refs/for/master
#如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
git push origin
#refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要
submodule
- 基本命令
#添加子模块
git submodule add <URL>
#下载总工程后子模块目录是空的,需要以下两个命令
git submodule init #初始化本地配置文件
git submodule update #从该项目中抓取所有数据
- 下载和更新代码
#下载代码
git clone <URL>
git checkout <branch_name>
#更新代码
git pull
#初次下载的代码需要初始化子模块
git submodule init
#提取子模块代码
git submodule update
- 提交代码(两阶段提交)
#提交子模块
cd submodule_dir
git add .
git commit -m "xxx"
git push origin <branch_name> 或者 git review
#提交总工程
cd total_dir
git pull
git submodule update
cd submodule_dir
git checkout <branch_name>
git pull
cd total_dir
git add submodule_dir
git commit -m "xxx"
git push origin <branch_name> 或者 git review
stash
如果本地有未提交的代码,然后想更新代码,这是可以先将改动代码存起来,等更新完代码后再拿出来。但这样做的一个风险就是,有可能代码冲突。
#存储修改
git stash
#实际应用中最好添加注释
git stash save "message"
#更新代码
git pull
#还原修改
git stash pop
#打印stash的堆栈
git stash list
#取出指定版本的内容
git stash pop stash@{1}
#只应用不取出
git stash apply stash@{1}
#删除指定版本的内容
git stash drop stash@{1}
#删除所有的内容
git stash clear
#查看修改的文件
git stash show
#显示差异对比
git stash show -u
如果有多次stash,则不要多次pop,代码是以堆栈的形式进行存储的,所以第一次pop的代码时最后一次stash的代码。
git远程分支
- 切换到远程分支
# 没有代码的情况
git clone xxx
git checkout -b <local_branch> origin/<branch>
# 有代码的情况
git checkout master
git pull
git checkout -b <local_branch> origin/<branch>
- 新建远程分支
git checkout -b <local_branch>
git push --set-upstream origin <local_branch>:<remote_branch>
# 此时本地分支和远程分支已经关联起来,如果不使用--set-upstream,本地和远程分支还没有关联起来,需要使用下面的命令
git branch --set-upstream-to=origin/<branch> <local_branch>
- 关联远程分支
git branch --set-upstream-to=origin/<branch> <local_branch>
git版本回退总结
- 整体回退
#版本库 -> 暂存区
git reset HEAD
#版本库 -> (暂存区,工作区)
git reset --hard HEAD
#暂存区 -> 工作区
git checkout .
- 单个文件回退
#版本库 -> 暂存区
git reset <file>
#暂存区 -> 工作区
git checkout <file>
git比较差异总结
- 整体比较
#工作区和暂存区
git diff
#暂存区和版本库
git diff --cached
#工作区和版本库
git diff HEAD
- 单个文件比较
#工作区和暂存区
git diff -- <file>
#暂存区和版本库
git diff --cached -- <file>
#工作区和版本库
git diff HEAD -- <file>
- 不同分支比较
如果是比较当前分支和其他分支的差异,可以省略branch1
#显示两个分支的详细差异
git diff branch1 branch2
#显示两个分支有差异的文件列表
git diff branch1 branch2 --stat
#显示指定文件的差异
git diff branch1 branch2 file
- 不同commit的比较
#显示两次commit之间的详细差异
git diff commit1 commit2
#显示两次commit之间有差异的文件列表
git diff commit1 commit2 --stat
#显示指定文件的差异
git diff commit1 commit2 file
git rebase/merge解决冲突
1. git pull --rebase
2. 解决冲突
3. git add xxx
4. git rebase --continue
冲突太多,不想要这个合并了怎么办
git rebase --abort
git merge --abort
新建仓库并提交本地代码至仓库
git init
git add README.md
git add .
git commit -m "first commit"
git remote add origin xxx #后面的链接是新建仓库的https或SSH链接
git push -u origin master
git开发流程总结
单独分支开发
主分支是master,然后新建了一个分支develop来开发新特性。这种情况一般是代码改动比较大的情况。
- merge
git checkout -b develop #创建并切换到develop分支
#进行开发
git add .
git commit -m "message"
git checkout master #切换到master分支
git merge develop #合并develop分支
git push origin master:refs/for/master #push代码
- rebase
#merge会造成主线存在多个分支,使用rebase较好
git checkout -b develop #创建并切换到develop分支
#进行开发
git add .
git commit -m "message"
git rebase master #rebase到master分支
git rebase develop master #将master分支rebase到develop分支(更新master),请将当前分支切换到master分支
##### 或者
git checkout master #切换到master分支
git merge develop #更新master分支到develop分支
#####
git push origin master:refs/for/master #push代码
一个应用场景:
开发任务较紧,一天之内本地需要提交多份代码,但是在新提交代码的时候,前面提交的代码还在review中,这就意味着前面提的代码可能还需要修改。
假设前面提了3份代码,现在需要提交第4份代码,主分支为master,每次提交都要切换到master分支:
前3次提交后分别建一个分支:test1、test2、test3,用来记录这3次提交。
第4次提交后需要修改第2次提交:
git checkout test2
git add .
git commit --amend
git rebase master
git rebase test2 master
git review
主分支开发
当代码量较少的时候,可以直接在主分支上开发。
#开发代码
git statsh #保存代码
git pull #更新代码
git statsh pop #弹出代码
git add .
git commit -m "message"
git push origin master:refs/for/master #push代码
注意: 在merge和pop的过程中有可能会出现冲突,这时需要解决冲突,进行add和commit之后再进行后续操作。