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 用法:
- 开发分支( dev)上的代码达到上线的标准后,要合并到 master 分支:
git checkout master
git merge dev
git push -u origin master
- 当 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 放弃修改 , 放弃增加文件操作
- 本地修改了一些文件 ( 并没有使用 git add 到暂存区 ),想放弃修改 :
- 单个文件 :
git checkout -- filename
- 所有文件 / 文件夹 :
git checkout .
- 本地新增了一些文件 ( 并没有 git add 到暂存区 ),想放弃修改 :
- 单个文件 / 文件夹 :
rm -rf filename
- 所有文件 :
git clean -nxfd
-f 删除 untracked files
-d 连 untracked 的目录一起删掉
-x 连 gitignore 的 untrack 文件 / 目录也一起删掉(慎用 , 一般这个是用来删掉编译出来的 .o 之类的文件用的)
-n 先看看会删掉哪些文件,防止重要文件被误删
- 本地修改 / 新增了一些文件,已经 git add 到暂存区,想放弃修改 :
- 单个文件 / 文件夹 :
git reset HEAD filename
- 所有文件 / 文件夹 :
git reset HEAD .
- 本地通过 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
- git diff
- 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。
- 检查补丁是否有冲突
git apply –check xxx.patch
- 无冲突打补丁
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