本地分支和远程分支的跟踪关系
git branch -vv
设置当前分支跟踪某个远程分支
git branch --set-upstream-to=<服务器地址>/<远程分支名>
解除当前分支的跟踪情况
git branch --unset-upstream
给远程服务器重命名,默认是origin
git remote rename origin server1
创建一个分支并跟踪远程分支
git checkout -b <本地分支名> <服务器地址>/<想跟踪的远程分支名>
git checkout -b localbranch server1/targetbranch
本地已有新分支的情况下,在远程仓库创建一个和本地新分支同名的远程分支,然后把本地分支推到仓库上,并关联二者
git push --set-upstream <远程仓库别名>or<远程仓库地址> <本地分支名>
初始化本地仓库,并把本地仓库推到一个空的远程仓库
git init
git add ./*
git commit -m "init"
git remote add REMOTE-SERVER <github 仓库地址> //给远程仓库命名
git branch -M main //本地分支由master改为main
git push --set-upstream REMOTE-SERVER main //在远程分支上创建一个本地分支的同名分支,再把本地仓库推到远程
or
git push -u REMOTE-SERVER main
放弃当前分支上,某个commit之后的所有commit,不会影响远程仓库,因此只要远程仓库上有备份就可以放心使用,但是要注意如果本地其他分支也在使用此commit后面的commit那么也将受到影响。
git reset --hard <想要回滚到的commit,之后的所有commit都将被丢弃且无法再被找回>
回滚至某个commit,reset的留痕版本,相当于新建一个commit把代码回滚到commit位置,但是之前的commit还会被保留。这个方法虽然保险,但是树看起来不干净。
git revert <commit id>
修改上一次commit的用户名和邮箱等信息
git commit --amend --author="作者 <邮箱@xxxx.com>" --no-edit
查看statge区和本地仓库的diff信息
(不加--staged只能查看workspace和本地仓库的diff信息)
git status
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: app/build.gradle
modified: app/src/main/AndroidManifest.xml
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: app/src/main/cpp/native-codec-jni.cpp
git diff app/src/main/cpp/native-codec-jni.cpp
git diff --staged app/build.gradle
git diff app/build.gradle 什么都不会显示,因为workspace里的改动已经被纳入statge区了,workspace里和 本地仓库是一致的。
把某个文件移除statge区,从而不被纳入下一次commit
git resotre file
查看所有分支(本地/远程)的commit情况
git log --oneline --all --graph
github生成密钥对
ssh-keygen -t rsa -b 4096 -C "ykun089@163.com"
忽略除了framework和hardware目录之外的所有文件
vim .gitignore
*
!framework/
!hardware/
罗列所有跟踪文件
git ls-files
把某个commit后面的所有commit还原到work space
git reset --soft <commit-id>
git reset 默认是 --soft
reset非常有用,一般是某个分支不小心合入了某个patch,然后想把这个patch剔除掉,那么就需要reset到patch之前的那个commit,再把后面的commit挨个合进来。
合并某个commit后的所有commit
git reset --soft <target commit id>
git add ./*
git commit --amend
合并其他分支的 commit 到当前分支
git cherry-pick <commit want to merge>
删除远程仓库的分支
#先删除本地分支
git branch -D <本地分支名>
#再通过push的方式删除远程分支
git push origin --delete <远程分支名,不需要加远程仓库别名或地址>
把当前分支的base切换为另一个分支的最新commit
git rebase <target branch>
关于rebase,参考:git rebase详解(图解+最简单示例,一次就懂)-CSDN博客
清理本地分支列表中所有已经不存在的远程分支
git remote prune origin
某些情况下,远程仓库的分支会被删除,但是本地仓库还是保留着老旧的分支信息,这些远程分支信息不会再 fetch 和 pull 的时候被删除,因此需要手动删除。
git commit --amend 之后的 git push 出现 “error: failed to push some refs to”。在确保代码正确的情况下使用覆盖推送:
git push --force
挪出暂存区,放入workspace,workspace代码保留代码变更信息
git resotre .
放入暂存区,workspace代码保留代码变更信息
git add .
把所有暂存区的内容放入临时存储区,相当于P4的shelve,workspace代码丢失代码变更信息,此时workspace里的代码和最后一个commit的快照保持一直
git stash .
把所有临时存储区的内容pop回暂存区
git stash pop
只把某个文件从暂存区放入临时存储区
git stash push filename
show merge commit 的实际内容,而不是show merge信息
git show -m <merge-commit-id>
直接git show <merge-commit-id> 会显示mereg信息,比如从哪个分支merge到哪个分支,不会显示这次merge修改的代码内容。
基于master的最新commit,把从当前commit开始,向前数 N 个 commit 合并成一个patch
git format-patch -N master
只把 branchA 的最新commit形成patch
git format-patch -1 branchA
应用patch
git am <patch-file>
把某个区间内的commit形成一个patch
#左闭右闭
git format-patch <commit-old-one>^..<commit-new-one>
#左开右闭
git format-patch <commit-old-one>..<commit-new-one>
这有别于上面命令里的以当前最新commit为开始位置,而是随意选择一个commit作为开始位置,随意选择一个commit作为结束位置。
commit-old-one 是较早的commit ,commit-new-one 是较迟的commit
创建新commit进行merge,当在某个分支上开发完成且获得阶段性确认结果后,把主分支merge过去,但是又想保持主分支的commit整洁,比如开发分支上有很多调试的commit。那么就可以在主分支上 merge 的时候带 --squash 选项,这样就会把所有需要合并的commit 归结到一起放在 workspace,然后通过git commit完成merge。一般本地仓库可以这样用,但是不要在污染远程仓库。
git checkout master
git merge --squash featurebranch
git commit -m "squash all commit between master and feature into one commit"
让git自动调整换行符为 lf 而不是 windows 的 crlf
.gitattributes 作用详细讲解(git大佬必会技能)-CSDN博客
强制使用远程分支的某个commit覆盖本地
当存在多个本次仓库时,仓库1可能会使用 --amend 来提交代码,并push --force覆盖到远程仓库,这样的话仓库2里就存在相同commit号但是commit内容不一致的情况,这个时候如果想要使用远程仓库的的commit覆盖仓库2的相同commit号的commit,那么可以使用如下命令。
git reset --hard origin/[targebranch-name]