David Dong

David Dong

Java/C/C#/Python

Java/C/C#/Python

POST

Git commands and usage tips

git-command-01

Git is a powerful version control tool. I would even say it’s one of the best. However, being powerful sometimes means being complex in terms of functionality. Git has a lot of commands. The good thing is that you can do everything you want with them, the bad thing is that you need to remember them. Here, I’ll write down the commands that I’ll use often to keep better track of them and make them easier to search.😉

推送到远程分支

用法:git push <远程主机名> <本地分支名>:<远程分支名>

1. 将本地的 master 分支推送到远程 master 分支

git push origin master

2. 将本地的 dev 分支推送到远程 master 分支

git push origin dev:master

3. 删除远程 master 分支

git push origin :master
git push origin --delete master

4. 添加远程主分支和本地 master 分支的绑定关系

git push -u origin master

绑定后可以直接将当前分支推送到origin主机的对应分支

git push origin

5. 强制推送本地dev分支到远程master分支

git push --force origin dev:master

6. 推送本地当前分支到远程 master分支

git push origin HEAD:master

拉取远程分支到本地

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

1. 拉取远程 master 分支到本地 dev 分支

git pull origin master:dev

2. 拉取远程 master 分支到本地当前分支

git pull origin master

3. 建立本地分支与远程分支的追踪关系

git branch --set-upstream master origin/next

建立追踪后可以直接省略远程分支名

git pull origin

4. git pull origin master:dev 等于

git fetch origin master:dev
git diff dev
git merge dev

5. 采用 rebase 的方式合并本地分支

git pull --rebase origin master:dev

创建新分支

1. 创建 newbranch 分支

git checkout -b newbranch

或者

git branch newbranch
git checkout newbranch

2. 创建新分支并与远程分支关联

git checkout -b tempbarch --track origin/testdevelop

删除分支

1. 删除本地分支

git branch -d newbranch

2. 强制删除本地分支

git branch -D newbranch

3. 删除远程 master 分支

git push origin :master
git push origin --delete master

重命名分支

git branch -m oldbranch newbranch
git branch -M oldbranch newbranch

添加远程分支

git remote add

git remote add origin https://github.com/gangdong/git_learn.git

克隆远程分支

git clone

git clone https://github.com/gangdong/git_learn.git

查看远程提交记录

git log remotes/origin/dev

添加 Github Token 到本地仓库

git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git
git remote set-url origin https://ghp_YIKL6G9C5oWxxxxxxssssKsoYg@github.com/gangdong/git_learn.git

git stash

应用场景

  • 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
  • 本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
  • git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上
  git stash
  git stash save "stash 01"
  
  # 恢复
  
  git stash pop 
  
  # 不自动删除堆栈内的内容
  
  git stash apply stash@{n}
  
  # 堆栈中移除某个指定记录
  
  git stash drop
  git stash clear
  git stash list
  
  # 查看某条 stash 的更改
  
  git stash show stash@{n}
  

合并分支

git merge

1. merge dev 分支和 dev2 分支

git checkout dev
git merge dev2
git mergetool
git checkout dev
git fetch origin dev2
git diff origin/dev2
git merge origin/dev2

2. 手动提交

git checkout dev
git merge --no-commit dev2

3. 如果有冲突,处理冲突

git checkout dev
git merge --no-commit dev2
git ls-files -s
git show :1:filename
git mergetool
git add .
git commit

git cherry-pick

1. 复制 dev2 的 aa3b6ca2 b821c4f7e1c 提交到 dev 分支

git checkout dev
git cherry-pick aa3b6ca2 b821c4f7e1c

注意cherry-pick 多个提交时注意顺序,否则会出现冲突。

git-cherry-pick 只是复制其他分支提交的内容到本地分支,复制后的commit id 和之前 pick的不同。这一点和 git merge/git rebase 有区别。git merge/git rebase 合并的是分支,之前原分支的commit id会带到本地分支。

git rebase

用法:

git rebase   [startpoint]   [endpoint]  --onto  [branchName]
git rebase -i  [startpoint]  [endpoint]

注意:[startpoint] [endpoint]指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit (注:该区间指定的是一个前开后闭的区间)。

1. 合并当前分支的多个提交记录

7f66117d96ac6db8661c66c55c5476c9be82622e modify readme.md
6af9edd695f3f51120b888d724eea4d254fe5bb3 master commit 02
3ce944b8cf3b35121936ae0fe59ca7ff76ed81d3 master commit 01
3f901ec367853b7852b30f0023af4398ee48235d my_dev work done.
86624b76ac8a6f16334605e0ee44f64305c4d8c3 my_dev first commit

合并3ce944b8c..7f66117d96ac6 三条提交记录

git rebase -i 3f901ec367853 7f66117d96ac6db

或者

git rebase -i HEAD~3

2. 复制一段提交记录到dev2分支

git rebase -i 3f901ec367853 7f66117d96ac6db onto dev2
git checkout dev2
git reset --hard  HEAD

3. 合并分支

dev 分支rebase master 分支

git checkout dev
git rebase master

4. 冲突处理

如果有冲突,解决掉冲突后,执行

git add .
git rebase --continue

rebase会改变原来的commit ID, 一旦对历史提交做出改变,那么从变基开始的那个提交往后所有的提交的commit ID 都会发生改变。
因此rebase命令使用要遵循以下原则:
1. “从来不要对任何已经提交到公共分支的提交记录做rebase操作,rebase操作会使得公共分支的提交记录变更,导致其他共用该分支的人的代码产生冲突。
2. 不基于rebase分支切换新分支。
3. 不对已经合入远程分支的本地分支做rebase。

git fetch

1. fetch 远程 dev 分支并merge

git fetch origin dev
git diff origin/dev
git merge origin/dev

Git log

1. 显示提交的差异

git log -p 

2. 显示 2 个提交信息

git log -2

3. 显示统计信息,包括哪些文件被改动

git log --stat

4. 显示格式,一行显示

git log --pretty=oneline

5. 格式化输出

git log --pretty=format:"%h - %an, %ar-%cr : %s"

按照 哈希值-作者,修改时间-提交时间:提交说明 显示

6. 图形化输出

git log --graph

通常比较有用的是

git log --pretty=formate:"%h - %an, %ar:%s" --graph
git log --pretty=format:"%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(cyan)%ar %C(bold blue)<%an>"

7. 按照作者查找提交

git log --author="david.dong" 

通常比较常用

git log --author="david.dong" --pretty=oneline

8. 按照内容匹配指定字符串的提交

git log -S

通常比较常用

git log -S "function_name" -p

9. 按照时间范围查找提交

git log --since --until
git log --since="2020-01-01" --until="2020-02-01"
git log --since="3 weeks ago" --until="2 days ago"

10. 限定查找 path/filename 的提交

git log -p -- path/filename

查找 david 对 fpc_bio_interface 的提交

git log --author="david" --pretty=oneline -- my_interface 

或者查找 Andy 对 my_db.c 的修改提交记录

git log --author="Andy" -- my_db.c

11. 查找提交说明中包含指定字符串的提交

git log --grep 
git log --pretty=oneline --grep="Minor refinement"
git log -p --grep="ISEE"

12. 仅显示merge的提交

git log --merges 

13. 不显示merge 提交

git log --no-merges 

14. 只打印主线提交

git log --first-parent 

15. 只打印某两个提交之间的记录

git log cd50063c9a625..ad3d6ae40d271778ae6

16. 显示某一个分支的提交记录

1. 显示 远程 dev 分支记录中有关 README.md 的提交

git log --pretty=oneline origin/dev -- README.md

2. 显示 master 分支记录

git log --pretty=oneline master

17. 查看只在一个分支中的提交

查看只在 master 中的提交记录

git log --pretty=oneline --right-only --no-merges --cherry-pick my_dev...master

查看只在 my_dev 中的提交记录

git log --pretty=oneline --left-only --no-merges --cherry-pick my_dev...master

查看只在 master 有, my_dev 没有的提交记录

git log master ^my_dev --pretty=oneline

或者

git log my_dev..master --pretty=oneline

查看只在 my_dev 有, master 没有的提交记录

git log my_dev ^master --pretty=oneline 

或者

git log master..my_dev --pretty=oneline

说明:
... 是列出两个分支不同的提交,等于 master..dev + dev..master, 如果加上 --left-only/--right-only 就等于 ..
.. 是列出一个分支有,另一个分支没有的提交。
因此:
git log --pretty=oneline --right-only --no-merges --cherry-pick my_dev...master
相当于 git log --pretty=oneline master ^my_dev
和 git log --pretty=oneline my_dev..master

18. 不显示 cherry-pick 的提交

git log --cherry-pick 

git grep

在某个提交中查找字符串

git grep "ISEE" cd5000634: 

git archive

打包某个提交的代码

git archive --format tar.gz --output "linux.5.9.tar.gz" 856deb866d16e29bd659

git show

查看某个提交的内容

git show 856deb866d16e29bd659

重设分支

1. reset –hard

git reset --hard 856deb866

2. reset –soft

git reset --soft 856deb866

区别:reset –hard 执行后之前的提交全部清除,reset –soft 执行后之前的提交会保留到暂存区,相当于staged.

撤消提交

git revert 856deb866

查看全部操作历史

git reflog

Git

相关文章

继续阅读