0%

git 日常用法

​ 日常开发中经常使用git作为版本控制,常用的话就是git命令,也可以使用第三方的 sourcetree 工具,对于常用命令来说,其实git命令基本够用了,但是当你大量阅读代码的时候,依托于ide,速度太慢了!

1、常用命令

git pull <远程主机名> <远程分支名>:<本地分支名>

git push <远程主机名> <本地分支名>:<远程分支名> , 和git pull 都是 src:dest

git fetch <远程主机名> <分支名> 其实就是拉去远程分支到本地版本库,然后再使用 git merge

git merge <branch> 合并分支,将<branch> 合并到当前所在的分支, 比如git merge master ,将本地master与自己的分支合并,比如git merge origin/branch ,就是将远程的origin/branch与本地的分支合并 , 比如不自动commit,可以git merge --no-commit <branch> 。 其实git merge 可以一次合并多个分支,比如 git merge <branch> origin/<branch> 其实就是管你远程和本地了全部合到我的分支上。

git diff <branch1> <branch2> 在两个分支之间比较

git diff --cached 比较 git add .工作区之间的比较, 也就是本地暂存区与工作区之间的比较

img

1
2
3
git diff	            工作区 vs 暂存区
git diff head 工作区 vs 版本库
git diff –cached 暂存区 vs 版本库

git reset --mixed 将暂存区的分支直接回到到工作区, 也就是比如git add . 你想回退到本地,直接 `git resrt –mixed

git reset --mixed HEAD~1 回退一个版本,比如你本地commit/远程已经push了,那么你本地和远程是一样的,如果你想回退一个版本,此时需要reset操作,主要是解决回退的操作,上面就是commit一次后需要回退一个版本,所以是HEAD~1, 比如commit了两次就是HEAD~2 , 此时有4种选项,一般分为--hard--mixed--soft, --hard 硬reset,回退回来你的这次修改全部没有了,也就是直接回到了上一个版本,而--mixed 回退到你没有git add . 操作的时候,--soft 是回退到你git add . 操作完后的时候。 看需求吧。一般只用--hard--mixed .

git commit --amend 主要是处理 你 git commit -m '' 想要修改 commit的desc/comment了。

git rm -r --cached . 比如修改了 gitignore ,但是其实你的版本库/暂存区是没有 ignore的,所以需要直接删除 暂存区的缓存。

git rm file 也就是删除本地开发的一个文件,硬删除,直接删没了,回退也需要硬回退。

git checkout . 清空本地所有修改的代码

git checkout -b <branch> 将本地的这个分支,checkout 出一个新的分支,名字为<branch>
git checkout -b <branch> origin/<branch> ,将远程的<branch> 分支上 checkout一个新的本地分支名字为`

有些场景可能需要打tag,所以一般是 git pull ,拉去远程的所有代码(记得切换到master上),然后 git tag 查看tag 历史,创建一个新的tag ,比如git tag v1.1.0,然后直接推送到远程git push origin v1.1.0 就好了(一般是别人给你合master了,上线可能需要打新的tag)

文件权限发生变更需要配置:git diff old mode 100644 new mode 100755 的问题 :需要设置 git config –add core.filemode false

git log -p README.md 查看文件的变更详细历史, git log <file> 查看文件的变更历史,另外有可能查看某一行的变更,这个是指你没有ide的情况下,所以需要指定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜  ebike-**** git:(master) ✗ cat -n  cmd/main.go
1 package main
2
3 import (
## ........
18 )
19
20 func main() {
# ......
24 // 启动RocketMQ
25 rq.RocketmqInit()
## ......
53 r.Run(fmt.Sprintf(":%s", host))
54 }
55
## .............
83 }

然后

1
➜  ebike-op-helios git:(master) ✗ git log -L 25:cmd/main.go

image-20210322143743628

git shortlog -sn 查看提交者

git submodel add remote_addr local_dir 子模块

1
2
# 将远程项目https://github.com/maonx/vimwiki-assets.git克隆到本地assets文件夹。
git submodule add https://github.com/maonx/vimwiki-assets.git assets

2、子模块

​ 有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。

文档:Git-工具-子模块

1、在父项目新建子模块

1
git submodule add https://github.com/chaconinc/DbConnector  ./submodule/DbConnector

2、提交子模块

  • 如果在父项目(父项目无任何变更)中提交子模块,会出现:
1
2
3
4
5
6
7
8
9
➜  test-dir git:(master) gitpush master
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
modified: submodule-01 (modified content)

no changes added to commit
Everything up-to-date
  • 父项目更更提交 (可以提交变更,但是子项目并没有提交)
1
2
3
4
5
6
➜  test-dir git:(master) ✗ gitpush master
[master f00fa83] fanhaodong 提交与2021-03-08 15:54:09
1 file changed, 1 insertion(+)
## ......
To gitee.com:Anthony-Dong/parent-report.git
53487e2..f00fa83 master -> master
  • 提交子项目(需要切换到子项目目录,然后切换到父项目提交)
1
2
3
4
5
6
7
8
9
10
11
12
➜  submodule-01 git:(master) ✗ gitpush master
[master 969f9ea] fanhaodong 提交与2021-03-08 15:52:08
## ....
To gitee.com:Anthony-Dong/submodule-01.git
6ac8e7d..969f9ea master -> master

➜ test-dir git:(master) ✗ gitpush master
[master 53487e2] fanhaodong 提交与2021-03-08 15:52:12
1 file changed, 1 insertion(+), 1 deletion(-)
## ....
To gitee.com:Anthony-Dong/parent-report.git
14e259d..53487e2 master -> maste

问题就是,提交流程过于复杂!!

参考

本人坚持原创技术分享,如果你觉得文章对您有用,请随意打赏! 如果有需要咨询的请发送到我的邮箱!