[持续更新] Git常用命令收录

git的忽略文件配置除了在项目的根目录下.gitignore还存在全局的.gitignore,一般是在用户根目录下的.gitignore_global

git项目配置信息查看
git config -l
git项目的地址查看
git remote -v
git remote get-url --all origin
git项目的地址删除
git remote rm origin
git项目的地址添加
git remote add origin git地址
git更新远程分支列表
git remote update origin --prune
git remote update origin -p
git同步远程全部分支列表
git fetch
git获取远程和本地全部分支列表
git branch -a
git获取本地全部分支列表
git branch
git基于分支新建分支
git checkout -b newbranch origin/xxbranch
git提交本地分支到远程指定分支
git push origin localbranch:remotebranch
查看commit的历史
git log
查看最新的commit Id
git rev-parse HEAD
git rev-parse --short HEAD
查看最新的commit Message
git log --pretty=format:"%s" -1 ${commit Id}
根据commit的备注信息搜索commit
git log --grep=要搜索的commit内容
查看某次commit的修改内容
git show
查看还没提交的修改
git diff
查看某个文件的修改历史
git log -p xxx/user/file/path
查看最近2次的更新内容
git log -p -2
clone 某个分支:
git clone -b dev5 https://git.coding.net/aiyongbao/tradepc.git
clone 所有分支:
git clone https://git.coding.net/aiyongbao/tradepc.git
git branch -r
git checkout dev5
clone 指定用户名和密码(邮箱账号中的@符号需要替换成%40):
git clone 账号:密码@https://git.coding.net/aiyongbao/tradepc.git
强制push
git push -u origin master -f
根据tag创建新的分支
git branch <new-branch-name> <tag-name>
git log filename
查看提交记录
git log -p filename
可以显示每次提交的diff
查看某次提交中的某个文件变化,可以直接加上fileName
git show c5e69804bbd9725b5dece57f8cbece4a96b9f80b filename
列出某个文件的所有改动历史,这里着眼于具体的一个文件,而不是git库
git log --pretty=oneline 文件名

删除所有的tag(匹配grep关键字)远程 git show-ref --tag | grep -E '发布版+' | awk '{print $2}'|xargs git push origin --delete
删除所有本地tag git tag -l | xargs git tag -d
从远程拉取所有信息 git fetch origin --prune

解决git每次提交代码都要输入帐号和密码(代码意思为保存身份信息,接下来再提交的时候,输入一次帐号和密码之后就不需要再次输入)
git config --global credential.helper store
附加命令:
展示最新的配置属性: git config --list
查看目前 Git 使用的策略所在目录: git config --show-origin --get credential.helper
清除凭证助手: git config --global --unset credential.helper 除了global外,system、local等范围,完成后使用git config --list命令展示配置属性,只要不存在credential.helper表示清除成功(或者去用户根目录下打开.gitconfig 文件手动删除[credential] helper =xxx 保存也行 )

.gitignore不生效问题解决方法
gitignore中已经标明忽略的文件目录下的文件,git push的时候还会出现在push的目录中,或者用git status查看状态,想要忽略的文件还是显示被追踪状态。
原因是因为在git忽略目录中,新建的文件在git中会有缓存,如果某些文件已经被纳入了版本管理中,就算是在.gitignore中已经声明了忽略路径也是不起作用的,
这时候我们就应该先把本地缓存删除,然后再进行git的提交,这样就不会出现忽略的文件了。

git rm -r --cached .
git add .
git commit -m 'update .gitignore'
git push -u origin master

git提交包含了超过100M的大文件时会报错:remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com. To https://github.com/xxxx/xxxxx.git
1.安装Git命令行扩展。只需要设置一次 : git lfs install (也可用命令安装 Mac系统brew install git-lfs 或 Linux系统:sudo apt-get install git-lfs)
2.选择您希望Git LFS管理的文件类型: git lfs track "*.exe"
3.确保跟踪: git add .
4.然后commit,再push即可

可同时设置上用户名和邮件,可以统计到贡献度和产生gitee动态
git config --global user.name "username"
git config --global user.email "email"
查看设置的用户名和邮件
git config user.name
git config user.email

合并两个分支
git checkout dev #切换到dev开发分支
git pull
git checkout master
git push origin master #将代码推到master上

当前分支合并到另一分支时,如果没有分歧解决,就会直接移动文件指针。这个过程叫做fastforward
举例来说,开发一直在master分支进行,但忽然有一个新的想法,于是新建了一个develop的分支,并在其上进行一系列提交,完成时,回到 master>分支,此时,master分支在创建develop分支之后并未产生任何新的commit。此时的合并就叫fast forward。
1、git merge dev
是将dev的分支合并到当前分支,应该默认是fast forward模式
2、git merge dev --no-ff
[具体区别](https://blog.csdn.net/qq_39416311/article/details/81264792)
--no-ff指的是强行关闭fast-forward方式。
ast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢>>失分支信息。因为在这个过程中没有创建commit
3、git merge dev --squash
是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,>于是使用--squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的>合并
4、git merge dev --allow-unrelated-histories
是将和当前分支无关的dev分支合并到当前分支,两个分支没得共同祖先

只合并某一个分支的某一个commit,更多参数参考文章
git cherry-pick <commitHash> // git cherry-pick命令的参数,不一定是提交的哈希值,分支名也是可以的,表示转移该分支的最新提交
git cherry-pick <HashA> <HashB> // cherry-pick支持一次转移多个提交
git cherry-pick A..B // 转移一系列的连续提交,可以转移从 A 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错;注意,使用上面的命令,提交 A 将不会包含在 Cherry pick 中。如果要包含提交 A,可以使用语法:git cherry-pick A^..B

丢弃代码相关

  1. 未使用git add 缓存代码
    git checkout -- filename //注意中间有--
    放弃所有文件修改
    git checkout .
    此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除
    此命令不会删除新建的文件,因为新建的文件还没加入git管理系统中,所以对git来说是未知,只需手动删除即可
  2. 已使用git add 缓存代码,未使用git commit
    git reset HEAD filename
    放弃所有文件修改
    git reset HEAD
    此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了第一步1. 未使用git add 缓存代码,继续使用用git checkout -- filename,就可以放弃本地修改
  3. 已经用 git commit 提交了代码
    git reset --hard HEAD^//回退到上一次commit的状态
    git reset --hard commit id // 回退到任意版本,使用git log命令查看git提交历史和commit id

执行完commit后,想撤回commit,怎么办?
这样凉拌:git reset --soft HEAD^
这样就成功的撤销了你的commit(注意,仅仅是撤回commit操作,您写的代码仍然保留)
说一下个人理解:HEAD^的意思是上一个版本,也可以写成HEAD~1
如果你进行了2次commit,想都撤回,可以使用HEAD~2
至于这几个参数:--mixed 意思是:不删除工作空间改动代码,撤销commit,并且撤销git add . 操作
这个为默认参数,git reset --mixed HEAD^ 和 git reset HEAD^ 效果是一样的。
--soft 不删除工作空间改动代码,撤销commit,不撤销git add .
--hard删除工作空间改动代码,撤销commit,撤销git add .
注意完成这个操作后,就恢复到了上一次的commit状态。

如果commit注释写错了,只是想改一下注释,只需要:git commit --amend
此时会进入默认vim编辑器,修改注释完毕后保存就好了

执行clone同时下载子模块的:git clone https://gitee.com/app_development/TestAndroid.git--recurse-submodules
(如果你已经克隆了项目但忘记了 --recurse-submodules,那么可以运行 git submodule update --init 将 git submodule init 和 git submodule update 合并成一步。如果还要初始化、抓取并检出任何嵌套的子模块, 请使用简明的 git submodule update --init --recursive)
如果网络不好或者其他原因导致子模块没有下载完全,这时用git pull是无法下载完全的,需要执行: git submodule update --init --recursive 检测继续下载

更新submodule的URL
执行 git submodule sync//更新 .gitmodules中对应submodule的条目URL, 更新 .git/config 中对应submodule的条目的URL

git 比较两个分支不同的commit
比如我们有 2 个分支:master, dev,现在想查看这两个 branch 的区别,有以下几种方式: undefined 1.查看 dev 有,而 master 中没有的:
1.查看 dev 有,而 master 中没有的:
git log dev ^master
同理查看 master 中有,而 dev 中没有的内容:
git log master ^dev
2.查看 dev 中比 master 中多提交了哪些内容:
git log master..dev
3.不知道谁提交的多谁提交的少,单纯想知道有什么不一样:
git log dev...master
4.在上述情况下,再显示出每个提交是在哪个分支上:
git log --left-right dev...master
commit 后面的箭头,根据我们在 –left-right dev…master 的顺序,左箭头 < 表示是 dev 的,右箭头 > 表示是 master的。undefined截图中表示这三个提交都是在 master 分支上的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355