前言:
本篇文档旨在记录自己在工作开发中常用git命令类型,为自己和他人提供一个比较系统的快查文档,不太涉及原理和背景解释。细节可以看文内引用文章或官方文档
1. 提交
1.1 正常提交
git add . //添加所有文件
git commit -m "本功能全部完成"
1.2 提交后想撤回
git reset --soft HEAD^ // 仅仅是撤回commit操作,写的代码仍然保留 HEAD^的意思是上一个版本,也可以写成HEAD~1, 如果你进行了2次commit,想都撤回,可以使用HEAD~2
--mixed 意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作 这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
--soft 不删除工作空间改动代码,撤销commit,不撤销git add .
--hard 删除工作空间改动代码,撤销commit,撤销git add . 注意完成这个操作后,就恢复到了上一次的commit状态。
git commit --amend // 如果commit注释写错了,只是想改一下注释。 此时会进入默认vim编辑器,修改注释完毕后保存就好了。
1.3 合并提交记录
背景:一个repo通常是由一个team中的多个人共同维护,如果需要增加新feature,那么就是一个feature分支了。由于开发中各种修改,本feature分支多次commit。最后提交master后,会看到乱七八糟的所有增量修改历史。其实对别人来说,我们的改动应该就是增加或者删除,给别人看开发过程的增量反而太乱。于是我们可以将feature分支的提交合并后然后再merge到主干这样看起来就清爽多了。
rebase的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因 此,合理使用rebase命令可以使我们的提交历史干净、简洁!
合并前可以先使用。git log --oneline
展示历史提交
bf37959b (HEAD -> master) test 2
2f8f6624 test 1
c53ad628 comit test end
然后使用命令 git rebase -i [startpoint] [endpoint]
其中-i
的意思是--interactive
,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]
则指定了一个编辑区间,如果不指定[endpoint]
,则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。 在查看到了log日志后,我们运行以下命令:
git rebase -i c53ad628 bf37959b
或者
git rebase -i HEAD~2
然后进入编辑, 选择f 进行合并commit
pick 2f8f6624 test 1
f bf37959b test 2
# Rebase c53ad628..bf37959b onto c53ad628 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
上面的选项说明如下
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
然后再查看。git log --oneline
发现提交已经被合并了
0c6ba35e (HEAD) test 1
c53ad628 comit test end
1.4 关于rebase命令的详细说明
下面这篇比较详细的介绍了具体命令,适合快查使用
这篇主要介绍了rebase的意义,适合用来理解
git rebase详解(图解+最简单示例,一次就懂)-CSDN博客
官网文档,感觉说的比较容易迷糊
Git - 变基
1.5 git在命令行里处理冲突
2. 删除本地和远程分支
我现在在dev20181018分支上,想删除dev20181018分支
1 先切换到别的分支: git checkout dev20180927
2 删除本地分支: git branch -d dev20181018
3 如果删除不了可以强制删除,git branch -D dev20181018
4 有必要的情况下,删除远程分支(慎用):git push origin --delete dev20181018
5 在从公用的仓库fetch代码:git fetch origin dev20181018:dev20181018
6 然后切换分支即可:git checkout dev20181018
注:上述操作是删除个人本地和个人远程分支,如果只删除个人本地,请忽略第4步
3. 推送代码
使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了
git push的一般形式为
git push <远程主机名> <本地分支名> <远程分支名>
例如
git push origin master:refs/for/master
意思:将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,
其中第一个master是本地分支名,第二个master是远程分支名。
3.1 推送远程分支
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push origin master
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
git push origin
3.2 删除指定的远程分支
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
git push origin :refs/for/master
3.5 使用 Git Push 设置 Upstream 分支
设置 Upstream 分支的最简单方法是使用 git push 命令和用于 Upstream 分支的 -u 选项。以下命令将使用分支名称将本地分支设置为远程分支。
$ git push -u <remote> <branch>
相反,你可以使用类似于 -u 选项的 --set-upstream 选项,它将本地分支设置为远程分支。
$ git push --set-upstream <remote> <branch>
让我们举一个例子,如果我们使用 checkout 命令创建了一个名为 branch 的分支。
$ git checkout -b branch
它切换到一个新的分支 branch。
避免必须精确输入 --set-upstream 的一种方法是使用其简短版本 -u,如下所示:
git push -u origin local-branch
这将轻松地为任何未来的任何推送或拉取命令设置 Upstream 关联。当我们需要推送到远程仓库并在命令中明确使用 --set-upstream 时,它将在本地环境中将我们推送到的分支设置为远程跟踪分支。
3.6 git push 的其他命令
这几个常见的用法已足以满足我们日常开发的使用了,还有几个扩展的用法,如下:
(1) git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push,
不带任何参数的git push,默认只推送当前分支,这叫做simple方式,还有一种matching方式,会推送所有有对应的远程分支的本地分支, Git 2.0之前默认使用matching,现在改为simple方式
如果想更改设置,可以使用git config命令。git config --global push.default matching OR git config --global push.default simple;可以使用git config -l 查看配置
(2) git push --all origin 当遇到这种情况就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要 -all 选项
(3) git push --force origin git push的时候需要本地先git pull更新到跟服务器版本一致,如果本地版本库比远程服务器上的低,那么一般会提示你git pull更新,如果一定要提交,那么可以使用这个命令。
(4) git push origin --tags //git push 的时候不会推送分支,如果一定要推送标签的话那么可以使用这个命令
3.6 关于 refs/for
// refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要
3.7 跟踪指定的远程分支
git checkout -b tmp origin/TMP
或者
git checkout --track origin/4.1.x
如果想要查看设置的所有跟踪分支,可以使用 git branch
的 -vv
选项。
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
master 1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
testing 5ea463a trying something new
这里可以看到 iss53 分支正在跟踪 origin/iss53 并且 “ahead” 是 2,意味着本地有两个提交还没有推送到服务器上。 也能看到 master 分支正在跟踪 origin/master 分支并且是最新的。 接下来可以看到 serverfix 分支正在跟踪 teamone 服务器上的 server-fix-good 分支并且领先 3 落后 1, 意味着服务器上有一次提交还没有合并入同时本地有三次提交还没有推送。 最后看到 testing 分支并没有跟踪任何远程分支。
4. 贮藏与清理
4.1 贮藏工作目录
有时,当你在项目的一部分上已经工作一段时间后,所有东西都进入了混乱的状态, 而这时你想要切换到另一个分支做一点别的事情。 问题是,你不想仅仅因为过会儿回到这一点而为做了一半的工作创建一次提交。 针对这个问题的答案是 git stash
命令。
为了演示贮藏,你需要进入项目并改动几个文件,然后可以暂存其中的一个改动。 如果运行 git status
,可以看到有改动的状态:
$ git status
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: index.html
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: lib/simplegit.rb
现在想要切换分支,但是还不想要提交之前的工作;所以贮藏修改。 将新的贮藏推送到栈上,运行 git stash
或 git stash push
:
$ git stash
Saved working directory and index state \
"WIP on master: 049d078 added the index file"
HEAD is now at 049d078 added the index file
(To restore them type "git stash apply")
可以看到工作目录是干净的了:
$ git status
# On branch master
nothing to commit, working directory clean
此时,你可以切换分支并在其他地方工作;你的修改被存储在栈上。 要查看贮藏的东西,可以使用 git stash list
:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
在本例中,有两个之前的贮藏,所以你接触到了三个不同的贮藏工作。 可以通过原来 stash 命令的帮助提示中的命令将你刚刚贮藏的工作重新应用:git stash apply
。 如果想要应用其中一个更旧的贮藏,可以通过名字指定它,像这样:git stash apply stash@{2}
。 如果不指定一个贮藏,Git 认为指定的是最近的贮藏:
$ git stash apply
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: index.html
modified: lib/simplegit.rb
no changes added to commit (use "git add" and/or "git commit -a")
应用选项只会尝试应用贮藏的工作——在堆栈上还有它。 可以运行 git stash drop
加上将要移除的贮藏的名字来移除它:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash drop stash@{0}
Dropped stash@{0} (364e91f3f268f0900bc3ee613f9f733e82aaed43)
也可以运行 git stash pop
来应用贮藏然后立即从栈上扔掉它。
4.2 清理工作目录
对于工作目录中一些工作或文件,你想做的也许不是贮藏而是移除。 git clean
命令就是用来干这个的。
清理工作目录有一些常见的原因,比如说为了移除由合并或外部工具生成的东西, 或是为了运行一个干净的构建而移除之前构建的残留。
你需要谨慎地使用这个命令,因为它被设计为从工作目录中移除未被追踪的文件。 如果你改变主意了,你也不一定能找回来那些文件的内容。 一个更安全的选项是运行 git stash --all
来移除每一样东西并存放在栈中。
你可以使用 git clean
命令去除冗余文件或者清理工作目录。 使用 git clean -f -d
命令来移除工作目录中所有未追踪的文件以及空的子目录。 -f
意味着“强制(force)”或“确定要移除”,使用它需要 Git 配置变量 clean.requireForce
没有显式设置为 false
。
如果只是想要看看它会做什么,可以使用 --dry-run
或 -n
选项来运行命令, 这意味着“做一次演习然后告诉你 将要 移除什么”。
$ git clean -d -n
Would remove test.o
Would remove tmp/
默认情况下,git clean
命令只会移除没有忽略的未跟踪文件。 任何与 .gitignore
或其他忽略文件中的模式匹配的文件都不会被移除。 如果你也想要移除那些文件,例如为了做一次完全干净的构建而移除所有由构建生成的 .o
文件, 可以给 clean 命令增加一个 -x
选项。
参考博客
git删除本地分支和删除远程分支 - 李勇888 - 博客园