GIT

Git push

# git push [ 远程主机名 ][ 本地分支名 ]:[ 远程分支名 ]
$ git push origin HEAD:master
# HEAD 是当前指向的分支 , 可以用 git show HEAD 查看
$ git show HEAD
$ git branch -a
# 需要 code view 时要加 /refs/for
$ git push origin HEAD:refs/for/master

# 不加远程分支名
$ git push origin dev
# 相当于 , 如果远程分支不存在则会自动创建 , 并创建联系
$ git push origin dev:dev
$ git branch --set-upstream-to=origin/dev
# 删除远程分支,直接推送空分支到远程分支
$ git push origin :dev

git diff

# 查看 unstaged 的改动 (还没 git add)
$ git diff
# 查看 staged 的改动 (git add 过的)
$ git diff --staged
# 显示出 branch1 和 branch2 中差异的部分
$ git diff branch1 branch2 --stat
# 显示指定文件的详细差异
$ git diff branch1 branch2 具体文件路径
# 显示出所有有差异的文件的详细差异
$ git diff branch1 branch2
# 显示本地 master 分支与远程 master 分支的区别
$ git diff master origin/master
# 比较两个 commit
git diff commit id1 commit id2

git log

# 查看前两个 commit 的修改
$ git log -p -2
# 查看改动了哪些文件
$ git log --stat
# 每个 commit 一行展示
$ git log --pretty=oneline
# 展示合并历史
$ git log --graph
# 从一定时间开始的 commit
$ git log --since=2.weeks
$ git log --since=2008-01-15
$ git log --since=2 years 1 day 3 minutes ago
# 查看哪些 commit 修改了 function_name
$ git log -S function_name
# 查看某个文件的 commit
$ git log -- path/to/file

You can also filter the list to commits that match some search criteria. The --author option allows you to filter on a specific author, and the --grep option lets you search for keywords in the commit messages.

git rebase, git merge

git merge:在 dev 分支 git merge main,// 将 main 最新的 commit 拉到 dev,有合并记录

git rebase:在 dev 分支 git rebase main // 修改 dev 分支,将 main 最新的 commit 拉到 dev,将 dev 最新的 commit 接到 main 后面

e.g 在本地一个分支上有了 C5 , C6 两个自己的 commit,但此时远程 master 分支上别人又合并了两个 C3,C4 分支。如果用 git pull( git fetch + git merge)会有一个新的 merge commit。此时需要 git rebase 将 c5,c6 接到最新的 master 代码 (c4) 上。

git merge 用法:

  1. 开发分支( dev)上的代码达到上线的标准后,要合并到 master 分支:
git checkout master
git merge dev
git push -u origin master
  1. 当 master 代码改动了,需要更新开发分支 (dev) 上的代码 :
git checkout dev
git merge master
git push -u origin dev

git revert

git revert + commit_id: revert 掉指定的 commit, 会生成一个新的 commit,需要 git push 到远程。加上 -n 参数可以自定义 commit 信息。

git stash

git stash save “add style to our site” 添加 stash 信息

git stash clear : 注意这是清空你所有的内容

git stash drop stash@{0} 这是删除第一个队列

git stash apply 不会删除内容

git stash pop 删除内容

git stash 不能 stash untracked 的文件,需要先 git add,或者 git stash -u

查看某个 stash 的具体内容: git stash show -p stash@{1}

git stash push 只 stash 某些路径的文件,或者只 stash 指定的文件。

git 放弃修改 , 放弃增加文件操作

  1. 本地修改了一些文件 ( 并没有使用 git add 到暂存区 ),想放弃修改 :
  • 单个文件 : git checkout -- filename
  • 所有文件 / 文件夹 : git checkout .
  1. 本地新增了一些文件 ( 并没有 git add 到暂存区 ),想放弃修改 :
  • 单个文件 / 文件夹 : rm -rf filename
  • 所有文件 : git clean -nxfd

-f 删除 untracked files
-d 连 untracked 的目录一起删掉
-x 连 gitignore 的 untrack 文件 / 目录也一起删掉(慎用 , 一般这个是用来删掉编译出来的 .o 之类的文件用的)
-n 先看看会删掉哪些文件,防止重要文件被误删

  1. 本地修改 / 新增了一些文件,已经 git add 到暂存区,想放弃修改 :
  • 单个文件 / 文件夹 : git reset HEAD filename
  • 所有文件 / 文件夹 : git reset HEAD .
  1. 本地通过 git add 和 git commit 后,想要撤销此次 commit:
  • 撤销 commit, 同时保留该 commit 修改:git reset commit_id ( 撤销之后,你所做的已经 commit 的修改还在工作区 )

  • 撤销 commit, 同时本地删除该 commit 修改:git reset --hard commit_id ( 撤销之后,你所做的已经 commit 的修改将会清除,仍在工作区 / 暂存区的代码也将会清除 )

这里的 commit id 可以通过 git log 查看选取前 6 位, commit_id 是想要回到的节点

git rebase

不要通过 rebase 对任何已经提交到公共仓库中的 commit 进行修改(你自己一个人玩的分支除外)

合并多个 commit 为一个完整 commit

https://www.jianshu.com/p/4a8f4af4e803

git rebase -i HEAD~3 修改 HEAD 往后三个分支(包括 HEAD)

或者 git rebase -i 某个 commit 修改某个 commit 前的所有提交

然后 git push -f 可以修改远程的 commit 记录

将某一段 commit 粘贴到另一个分支上

git patch

生成 patch

  1. git diff
  2. git format-patch

生成某个提交的补丁 :

  • git diff > xxx.patch
  • 生成单个 commit 的 patch: git format-patch <commit_id> -1

git apply

git apply 是另外一种打 patch 的命令,其与 git am 的区别是: git apply 并不会将 commit message 等打上去,打完 patch 后需要重新 git add 和 git commit

  1. 检查补丁是否有冲突

git apply –check xxx.patch

  1. 无冲突打补丁

git apply xxx.patch

git am

git am 会直接将 patch 的 所有信息 打上去,而且不用重新 git add 和 git commit, author 也是 patch 的 author 而不是打 patch 的人。

git am 之前可以 git apply –check 一下

无冲突: git am xxx.patch

有冲突: git am –reject xxx.patch

此时会在有冲突的文件相同文件夹生产一个以原来文件名加后缀为 .rej 的新文件,里面会告知哪些地方冲突了,

参考这些冲突的地方修改原文件即可

修改完成后添加到缓冲区 git add xxx1.c xxx2.c ….

最后 git am –continue 即可完成打补丁。

git commit –amend -s 可以添加自己的 signed-off

https://blog.csdn.net/u013318019/article/details/114860407

git tag

https://www.runoob.com/git/git-tag.html

# 查看所有标签
$ git tag

# 创建
$ git tag -a v1.0

# 删除
$ git tag -d v1.0

# 查看
$ git show v1.0

# 切换
git checkout v1.0

tag 需要单独上传 git push origin <tagname> 和删除 git push origin --delete <tagname>

创建分支并与远程某分支关联

# 可以先更新远程分支信息
git remote update origin --prune

# git checkout -b 本地新分支 远程分支。远程分支可以 git branch -a 查看
git checkout -b test origin/test

# 查看本地分支与远程分支匹配
git branch -vv

# 用下面的操作两个分支会对不上,无法 git push,因为 test 分支可能是从 master 分支新建过来的, git log 都不对应,需要一个干净的分支
git chekcout -b test
git branch --set-upstream-to=origin/develop

MISC

在 repository 中不小心上传了大文件或者隐私数据:
https://help.github.com/articles/removing-sensitive-data-from-a-repository/

git branch -f dev HEAD^ // 让 dev 分支指向 HEAD^

git remote show origin:查看远程信息

git branch –set-upstream-to=origin/develop(远程分支) develop:关联远程分支

那么如何查看已经配置分支关联信息呢,通过下述三条命令均可:

git branch -vv
git remote show origin
cat .git/config

当前的修改分别提交到两个 commit

首先把当前 commit 需要的修改 amend 进去 :

$ git add 文件 1 文件 2 ...
$ git commit --amend

接着把前一个 commit 的修改 stash, 再开启 rebase:

$ git stash
$ git rebase -i HEAD~2

把前一个 commit 的 pick 修改成 edit:

edit 旧 commit 的哈希值 旧 commit 的信息
pick 新 commit 的哈希值 新 commit 的信息

把前一个 commit 要加的修改 amend 进去, 最后 finish rebase:

$ git stash
$ git add 文件 3 文件 4 ...
$ git commit --amend
$ git rebase --continue

References

An online game to learn Git

Pro Git