git常用命令
前言:对git做下总结。
一、准备工作
1、完善用户信息
用于标识用户机器信息,例如
# 安装git,sudo apt-get install git
# git --version查看版本
hk@pc:~/git/xiaokui.site$ git config --global user.email "467914950@qq.com"
hk@pc:~/git/xiaokui.site$ git config --global user.name "good-looking-hk"
2、创建ssl密匙
# 第一次启用时需要设置ssl密匙,替换为自己的邮箱,需要三次回车确认
ssh-keygen -t rsa -C "467914950@qq.com"
在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人 。
最后把公钥告诉github(可以添加多个),填写ssl密匙就行了。
二、本地仓库命令
这些功能是一个版本控制管理软件都具有的,比如说svn,这里我们看下git的语法。
1、新建仓库
在某个目录下,执行git init,例如
hk@pc:~/git/xiaokui.site$ git init
已初始化空的 Git 仓库于 /home/hk/git/xiaokui.site/.git/
2、添加提交
新建仓库后,可以添加提交文件,添加操作可以有多次(当然也可以一次添加多个),但提交只需一次,例如
# test.txt是存在于当前目录下的,内容随意(如果文件名是小数点".",则表示当前目录所有文件)
# 将文件放入暂存区
hk@pc:~/git/xiaokui.site$ git add test.txt
# -m 用于添加本次提交的说明信息
# 提交文件至工作区
hk@pc:~/git/xiaokui.site$ git commit -m "this is a test commit"
[master 851f565] this is a test commit
1 file changed, 2 insertions(+)
create mode 100644 test.txt
# 查看初次提交的文件
hk@pc:~/git/xiaokui.site$ vi test.txt
# 下面为文件内容
this is a test txt
version = 1.0
3、修改提交
修改上述的test.txt,将其version改为2.0,例如
# 使用git status可以查看仓库当前的状态,文件是否被修改
hk@pc:~/git/xiaokui.site$ git status
位于分支 master
您的分支领先 'orgin/master' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: test.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
# 上面的命令输出告诉我们,test.txt被修改过了,但还没有准备提交修改
此时我们可以通过git diff,看看修改文件内容与修改前文件内容的不同,例如
# 可以指定文件,也可以不指定(默认显示所有修改过但未提交的)
hk@pc:~/git/xiaokui.site$ git diff test.txt
diff --git a/test.txt b/test.txt
index a0d1b88..f731ff7 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,2 @@
this is a test txt
-version = 1.0
+version = 2.0
知道不同后,我们可以确认提交了,例如
hk@pc:~/git/xiaokui.site$ git add test.txt
# 此时状态显示是待提交
hk@pc:~/git/xiaokui.site$ git status
位于分支 master
您的分支领先 'orgin/master' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: test.txt
hk@pc:~/git/xiaokui.site$ git commit -m "test for 2.0"
[master d7b0f85] test for 2.0
1 file changed, 1 insertion(+), 1 deletion(-)
hk@pc:~/git/xiaokui.site$ git status
位于分支 master
您的分支领先 'orgin/master' 共 2 个提交。
(使用 "git push" 来发布您的本地提交)
4、回滚版本
可以通过git log来查看历史提交记录,例如
hk@pc:~/git/xiaokui.site$ git log
commit d7b0f8509c6cdc1f302034fb2326d579631314bd (HEAD -> master)
Author: good-looking-hk <467914950@qq.com>
Date: Thu Jul 19 20:01:38 2018 +0800
test for 2.0
commit 851f565c940067f027832127cc040a02cc8d71bb
Author: good-looking-hk <467914950@qq.com>
Date: Thu Jul 19 19:30:57 2018 +0800
this is a test commit
commit 387fef4b147fa1ac34d429abe6a6248c01484e55 (orgin/master)
Author: good-looking-hk <467914950@qq.com>
Date: Thu Jul 19 15:06:24 2018 +0800
first commit
commit c8f1cd60aff3ce02f2f363e1fdf2df42e2e40eed
Author: good-looking-hk <467914950@qq.com>
Date: Thu Jul 19 14:44:48 2018 +0800
first commit
commit da406fcc791f9f2936553b4a27077ea67d755aef
Author: 一般般帅 <467914950@qq.com>
Date: Thu Jul 19 14:37:06 2018 +0800
Initial commit
git可以多个版本之间任意穿梭,类似与丝光机,这次我们看下如何回到上一个版本,例如
1、reset
reset的作用是修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本。适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。 例如当前在版本三,想回退到版本一,同时丢弃掉版本二和版本三的所有改动,可使用reset操作。
# 回滚到之前的提交
git reset --hard 96777f7c
# 强推
# 但是对于受保护的分支,不能进行强推
git push -f
2、revert
revert操作,适用于撤销某一版本,而保留该版本之后的其他版本提交。适用场景:例如某需求先后进行过第一、第二、第三次版本提交之后发现第二个版本有问题,需要撤销第二个版本的操作,同时保留第三次版本的提交,可使用git revert操作。
# 回滚到上一次提交就是HEAD^,上上次就是HEAD^^,一百次就是HEAD~100
hk@pc:~/git/xiaokui.site$ git reset --hard HEAD^
HEAD 现在位于 851f565 this is a test commit
# 此时我又不想回滚了,此时需要找到目标版本的commit id,前缀匹配
hk@pc:~/git/xiaokui.site$ git reset --hard d7b0
HEAD 现在位于 d7b0f85 test for 2.0
# 万一找不到上面的commit id,即当前命令行被关闭后无法查看,此时方法还是有的
# git reflog用于记录每次commit命令机器当前commit id
hk@pc:~/git/xiaokui.site$ git reflog
851f565 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
d7b0f85 HEAD@{1}: reset: moving to d7b0
851f565 (HEAD -> master) HEAD@{2}: reset: moving to HEAD^
d7b0f85 HEAD@{3}: commit: test for 2.0
851f565 (HEAD -> master) HEAD@{4}: commit: this is a test commit
387fef4 (orgin/master) HEAD@{5}: rebase finished: returning to refs/heads/master
387fef4 (orgin/master) HEAD@{6}: pull --rebase orgin master: first commit
c8f1cd6 HEAD@{7}: pull --rebase orgin master: first commit
da406fc HEAD@{8}: pull --rebase orgin master: checkout da406fcc791f9f2936553b4a27077ea67d755aef
dad390e HEAD@{9}: commit: first commit
0ed848d HEAD@{10}: commit (initial): first commit
5、撤销修改
有时修改了文件,但又想放弃修改,此时例子如下
# 把test.txt文件在工作区的修改全部撤销,通俗点就是让这个文件回到最近一次git commit或git add时的状态
# 一般都是用这个,即revert
$ git checkout -- test.txt
# 假设此时需要放弃修改的文件已经被add了,此时需要撤销掉暂存区的修改
# git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本
$ git reset HEAD test.txt
# 由于修改文件又放回了工作区,此时需要放弃工作区修改
$ git checkout -- test.txt
6、删除文件
第一种情况:真的要删,例子如下
# 这是最正规的一种,删除且提交
hk@pc:~/git/xiaokui.site$ git rm test.txt
rm 'test.txt'
hk@pc:~/git/xiaokui.site$ git commit -m "delete test.txt"
[master 7afc8d3] delete test.txt
1 file changed, 2 deletions(-)
delete mode 100644 test.txt
# 还有一种就是先rm test.txt,git发现了修改,此时如果需要从版本库中删除,还是上面的步骤
# 还是需要声明删除操作
hk@pc:~/git/xiaokui.site$ git rm test.txt
hk@pc:~/git/xiaokui.site$ git commit -m "delete test.txt"
第二种情况:删错了,需要从版本库恢复,例子如下
# git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
$ git checkout -- test.txt
三、远程仓库管理
1、关联远程仓库
- 远程仓库为空,本地仓库不为空
# 本地库关联远程仓库site.xiaokui,这里的orgin意为远程仓库,git中的默认叫法,可以更改
# 适用于远程仓库为空的情况
hk@pc:~/git/xiaokui.site$ git remote add orgin git@github.com:good-looking-hk/site.xiaokui.git
# 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,等同于--set-upstream]
# git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令
# 首次提交加-u,后面提交可以简化为git push
hk@pc:~/git/xiaokui.site$ git push -u orgin master
Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.
对象计数中: 245, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (232/232), 完成.
写入对象中: 100% (245/245), 303.88 KiB | 188.00 KiB/s, 完成.
Total 245 (delta 25), reused 0 (delta 0)
remote: Resolving deltas: 100% (25/25), done.
To github.com:good-looking-hk/site.xiaokui.git
da406fc..387fef4 master -> master
分支 master 设置为跟踪来自 orgin 的远程分支 master。
- 远程仓库不为空,本地仓库不为空
# 这里的情景为gitee上面已经有了一些初始化文件,而本地是之前的同步的的github仓库
# 此时应该的做法,是删除远程仓库,保留本地仓库
# 为了演示方便,这里额外演示合并、保留远程仓库、新建分支保存本地仓库
# 先关联好github、gitee远程库
# 查看远程库信息
hk@pc:~/JavaSpace/for_test$ git remote -v
origin https://github.com/good-looking-hk/for_test (fetch)
origin https://github.com/good-looking-hk/for_test (push)
# 尝试同步gitee远程origin,由于之前已经绑定了github,所以这一步会失败
hk@pc:~/JavaSpace/for_test$ git remote add origin git@github.com:good-looking-hk/for_test.git
fatal: 远程 origin 已经存在。
# 先移除origin
hk@pc:~/JavaSpace/for_test$ git remote rm origin
# 移除成功
hk@pc:~/JavaSpace/for_test$ git remote -v
# 同时关联github、gitee
hk@pc:~/JavaSpace/for_test$ git remote add github git@github.com:good-looking-hk/for_test.git
hk@pc:~/JavaSpace/for_test$ git remote add gitee git@gitee.com:good-looking-hk/for_test.git
hk@pc:~/JavaSpace/for_test$ git remote -v
gitee git@gitee.com:good-looking-hk/for_test.git (fetch)
gitee git@gitee.com:good-looking-hk/for_test.git (push)
github git@github.com:good-looking-hk/for_test.git (fetch)
github git@github.com:good-looking-hk/for_test.git (push)
# 推送到GitHub
hk@pc:~/JavaSpace/for_test$ git push github master
# 推送到Gitee,我们重点关注这一步
hk@pc:~/JavaSpace/for_test$ git push gitee master
# 第一种,删除远程仓库,保留本地仓库
# 强制覆盖,只在特定情况下使用
hk@pc:~/JavaSpace/for_test$ git push -f gitee master
# 第二种,合并远程仓库,如果出现冲突,那么先解决冲突后再push
hk@pc:~/JavaSpace/for_test$ git pull gitee master
# 第三种,保留远程仓库 git clone就行
# 第四种,保留远程仓库,新建分支保留本地仓库
hk@pc:~/JavaSpace/for_test$ git branch
dev
* master
hk@pc:~/JavaSpace/for_test$ git checkout dev
切换到分支 'dev'
# 将dev分支推送至远程dev分支,会自动新建远程dev分支
hk@pc:~/JavaSpace/for_test$ git push gitee dev
枚举对象: 7, 完成.
对象计数中: 100% (7/7), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (4/4), 完成.
写入对象中: 100% (6/6), 522 bytes | 522.00 KiB/s, 完成.
总共 6 (差异 2),复用 0 (差异 0)
remote: Powered by GITEE.COM [GNK-5.0]
remote: Create a pull request for 'dev' on Gitee by visiting:
remote: https://gitee.com/good-looking-hk/for_test/pull/new/good-looking-hk:dev...good-looking-hk:master
To gitee.com:good-looking-hk/for_test.git
* [new branch] dev -> dev
2、同步远程仓库
# add和commit操作之后,简化版提交
$ git push
# 如果远程仓库的版本存在某个文件,而不能保持同步本地仓库,或者某些版本问题,此时可以强制推送
$ git push origin master -f
# 合并再推送
$ git pull
$ git push origin
四、分支管理
1、新建分支
# 查看所有分支,*表示当前使用分支
hk@pc:~/JavaSpace/for_test$ git branch
* master
# 创建dev分支
hk@pc:~/JavaSpace/for_test$ git branch dev
hk@pc:~/JavaSpace/for_test$ git branch
dev
* master
# 切换到dev分支,新版git也可以使用git switch <name>
# 创建、切换分支可以合并为一条命令:git checkout -b dev 或 git switch -c <name>
hk@pc:~/JavaSpace/for_test$ git checkout dev
切换到分支 'dev'
# 切换dev分支后,提交文件,再切换到master分支,则此次提交对master分支不可见
hk@pc:~/JavaSpace/for_test$ git branch
* dev
master
2、合并分支
hk@pc:~/JavaSpace/for_test$ git branch
dev
* master
# 这里只是简单的增量合并
hk@pc:~/JavaSpace/for_test$ git merge dev
更新 833fef6..98c1837
Fast-forward
dev_branch.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dev_branch.txt
# 冲突合并,dev、master分支均修改同一个文件
hk@pc:~/JavaSpace/for_test$ git merge dev
自动合并 dev_branch.txt
冲突(内容):合并冲突于 dev_branch.txt
自动合并失败,修正冲突然后提交修正的结果。
# 此时,出现冲突的文件内容如下
<<<<<<< HEAD
this is master branch text
=======
this is dev branch text
>>>>>>> dev
# 将dev_branch.txt修正并提交,即可解决冲突
# 修正内容如下
this is master branch text
this is dev branch text
retain all
# 提交修改,可以用git log --graph看到分支合并图
hk@pc:~/JavaSpace/for_test$ git add dev_branch.txt
hk@pc:~/JavaSpace/for_test$ git commit -m 'resolve conflict' dev_branch.txt
fatal: 在合并过程中不能做部分提交。
hk@pc:~/JavaSpace/for_test$ git commit -m 'resolve conflict'
[master 8ae2801] resolve conflict
hk@pc:~/JavaSpace/for_test$ git merge dev
已经是最新的。
3、删除分支
hk@pc:~/JavaSpace/for_test$ git branch
dev
* master
hk@pc:~/JavaSpace/for_test$ git branch -d dev
已删除分支 dev(曾为 98c1837)。
hk@pc:~/JavaSpace/for_test$ git branch
* master
五、标签管理
每次提交都有commit id,为了方便记忆,可以为每次commit单独打个Tag,尤其适用于每次发版本。
1、新建标签
# 查看所有tag
hk@pc:~/JavaSpace/for_test$ git tag
# 为当前分支最新commit打上tag
hk@pc:~/JavaSpace/for_test$ git tag v1.1
hk@pc:~/JavaSpace/for_test$ git tag
v1.1
# 为历史commit打上tag,先查找
hk@pc:~/JavaSpace/for_test$ git log --pretty=oneline --abbrev-commit
9402a6f (HEAD -> dev, tag: v1.1, gitee/dev) dev update
98c1837 提交dev分支内容
833fef6 (gitee/master) 修正冲突
64b1d14 增加一个测试文件5
bc24f3c update test/test2.md.
9cbb4ad 增加一个测试文件5
a1c5c5c update test.txt.
e0086b0 add testaa.测试无冲突合并
c638b98 (github/master) 增加一个测试文件5
ae84182 增加一个测试文件5
# 为修正冲突commit打上tag
hk@pc:~/JavaSpace/for_test$ git tag v0.8 833fef6
hk@pc:~/JavaSpace/for_test$ git tag
v0.8
v1.1
# 查看tag详细信息
hk@pc:~/JavaSpace/for_test$ git show v1.1
commit 9402a6f17886665cbdbb62f8e06389e4d422157d (HEAD -> dev, tag: v1.1, gitee/dev)
Author: good-looking-hk <467914950@qq.com>
Date: Fri Jun 26 10:09:59 2020 +0800
dev update
diff --git a/dev_branch.txt b/dev_branch.txt
index e69de29..af2d165 100644
--- a/dev_branch.txt
+++ b/dev_branch.txt
2、删除标签
# 删除标签
hk@pc:~/JavaSpace/for_test$ git tag -d v1.0
已删除标签 'v1.0'(曾为 9402a6f)
# 删除远程仓库标签
hk@pc:~/JavaSpace/for_test$ git tag -d v0.9
已删除标签 'v0.9'(曾为 bc24f3c)
hk@pc:~/JavaSpace/for_test$ git push gitee :refs/tags/v0.9
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:good-looking-hk/for_test.git
- [deleted] v0.9
3、推送标签至远程
# 提交tag至远程仓库,仓库浏览器中有专门的tag查看页面
hk@pc:~/JavaSpace/for_test$ git push gitee v1.1
总共 0 (差异 0),复用 0 (差异 0)
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:good-looking-hk/for_test.git
* [new tag] v1.1 -> v1.1
# 一次性推送全部尚未推送到远程的本地标签,登录远程仓库即可查看tag更新
hk@pc:~/JavaSpace/for_test$ git tag v0.9 bc24f3c
hk@pc:~/JavaSpace/for_test$ git tag
v0.8
v0.9
v1.1
hk@pc:~/JavaSpace/for_test$ git push gitee --tags
总共 0 (差异 0),复用 0 (差异 0)
remote: Powered by GITEE.COM [GNK-5.0]
To gitee.com:good-looking-hk/for_test.git
* [new tag] v0.8 -> v0.8
* [new tag] v0.9 -> v0.9
参考自 廖雪峰的官方网站Git教程,感谢作者的分享。
一般般帅