[git] git 常用命令

本文介绍了Git中本地分支与远程分支的跟踪操作,包括设置与解除跟踪、重命名远程仓库、创建并跟踪分支、推送与合并分支、回滚与reset操作、提交信息修改、diff查看以及stash管理。此外,还涉及gitignore配置、patch的创建与应用、mergesquash策略以及gitattributes文件的作用。
摘要由CSDN通过智能技术生成

本地分支和远程分支的跟踪关系

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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值