git 常见操作总结

git(分布式管理系统)

git本地操作

  1. git config
    git config --global user.name "Your Name"
    git config --global user.email "email@example.com"

  2. git log
    git log --oneline oneline为--pretty=oneline --abbrev-commit简写
    git log -p 查看提交记录,并且展示具体修改
    git log --author=< somebody > --grep fix 过滤查看某人的某次提交工作内容(commit message)

  3. git reflog
    git reflog --oneline 列出所有操作记录,包括提交、切换分之、合并分之等

  4. git reset --hard [HEAD | commitId] (HEAD指当前版本)
    git reset --hard HEAD^ 回退到上次提交版本
    git reset --hard HEAD^^ 回退到上上次提交版本
    .....
    git reset --hard HEAD~10 回退到十次提交以前
    git reset --hard e8f8gd 回退到e8f8gd 这一次
    git reset -–hard origin/master 回退到与远程master代码一样

    git reset --soft HEAD^ 回退到上次暂存区状态
    git reset --mixed HEAD^ 回退到上次工作区状态
    以此类推....

  5. git diff 比较的是工作区和暂存区的差别
    git diff --cached 比较的是暂存区和版本库的差别
    git diff HEAD 可以查看工作区和版本库的差别
    git diff 分支1名 分支2名 文件名 分之可以为本地分之,也可以为远程分之

  6. git checkout -- readme.txt 丢弃工作区的修改

    • 一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
    • 一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
    • 总之,就是让这个文件回到最近一次git commit或git add时的状态。
  7. git reset HEAD <file> 回退暂存区到工作区的修改,再执行git checkout -- <file> 将会回退到上一次提交时的版本

  8. git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

  9. git rm readme.txt rm 参数为 add 取反删除

  10. git rm -r --cached 文件/文件夹 名字有不该提交的文件已经提交后,仅仅在.gitignore中加入忽略是不行的,执行该命令再重新 git add. git commit即可

  11. git clone < git@github.com:xxx/xxxx.git >

git 分之操作管理

  1. git checkout -b dev 新建一条dev分之,并切换(-b)到dev分之
    git checkout -b dev = git branch dev + git checkout dev
    git checkout -b 本地分支名 origin/远程分支名 从远程拉取一条本地不存在的分之并切换到上面

  2. git branch 查看当前本地所有分支
    git branch --merged 查看已经合并到当前分之的分支 --no-merged 没有合并过的分支
    git branch -d dev 删除dev分之
    git branch -D dev 强制删除没有合并过的dev分之
    git branch --set-upstream-to=origin/dev dev 将远程dev分之与本地dev 分之关联起来。下次直接git pull 或者 git push 就可以了,不用带远程分之名称
    git branch | grep -v "master" | xargs git branch -D 将除master以外所有本地分支删除
    git branch -r | grep -v "master" | xargs git branch -D -r 将除master以外所有远程关联分支删除

  3. git merge dev 将dev分之修改内容合并到当前分之上

  4. git rebase 变基操作
    下面用例子来区分rebase与merge区别:

    • 假设有master分之, 我们在master提交一次C1。
    • 然后检出分之dev 提交两次C2
    • 然后切换分之到master,然后提交一次C3并且C3与C2修改了同一行代码,造成冲突
    • 然后再在master 上提交一次C4
    • 然后切换到dev 上提交一次C5
    • 这时切换到master上合并dev git merge dev 生成的提交线为 C1 > C2 > C3 > C4 > C5 > C6,这是按照提交事件来进行合并,C6 为你解决了C2与C4造成冲突的新修改
      但是, 用rebase就得到的不一样结果,
    • 假设现在没做上次 merge 操作,
    • 然后git rebase master,这时候 git提示出现了代码冲突,此处为之前埋下的冲突点,处理完毕后 git add . ( 添加冲突处理后的文件),
    • git rebase --continue (加上--continue参数让rebase继续处理),
    • 然后git checkout mastergit merge dev
    • 这时候master处理完的提交线为 C1>C3>C4>C2>C5, 能够看出dev是变基线为master最新一次提交,然后再合并dev两次提交。
      注意
  5. git stash // 暂存工作区
    git stash apply <暂存记录,不写默认最近一次>将暂存区内容恢复到工作分之
    git stash list 查看多次暂存记录
    git stash drop stash@{0} 将stash@{0}次暂存删除
    git stash pop <暂存记录,不写默认最近一次> 将暂存区内容恢复到工作分之并删除暂存
    git stash branch <newbranch> 将暂存内容恢复到一个新分支上

  6. 分支策略

    • 在实际开发中,我们应该按照几个基本原则进行分支管理:
    • 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
    • 那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
    • 每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
    • 如果有bug需要修复,则切换到需要修复分之,然后检出新分支比如 bugfix 分之进行修复部署
    • master release hotfix develop feature 分之个人理解
  7. 多人协作

    • 多人协作的工作模式通常是这样:
    • 首先,可以试图用git push origin < branch-name >推送自己的修改;
    • 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    • 如果合并有冲突,则解决冲突,并在本地提交;
    • 没有冲突或者解决掉冲突后,再用git push origin < branch-name >推送就能成功!
    • 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令**git branch --set-upstream-to=origin/< branch-name > < branch-name > **。
  8. 常常令人窒息的操作

    • git cherry-pick选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit)
      • 比如B分之想合并A分之的某一次commit
      • 首先git log 找到A上面提交的commitId记录下来,然后git checkout b,
      • 然后git cherry-pick commitId or git cherry-pick commitId1..commitId100(不包含开始的第一个commitID1,包含最后commitId100)
    • git rebase -i < commitId > 弹出某次commitId 到至今的提交记录
      • 上面操作会打开提交记录
        pick 4968689 添加了一个文件A
        pick 7a1d0c0 添加了一个文件B
      • 如果想删除 添加了一个文件A 这次提交,则将最前面pick 改为drop,然后wq退出,则删除
      • 如果想同步到远程仓库 git push -f (再次提醒该命令慎用!!)
    • git revert 不一样的版本回退
      • 首先找到想回退的版本ID git log

      • git revert < commitId >

      • 会生成一次新的提交,文件内容将删除commitId这一次的提交

      • git revert -n commitID1..commitIDN 回退这两次版本之间的版本(不包含commitID1, 包含commitIDN),但是不会生成一次新的commit,需要手动add,commit

    • git fork
      • git fork 不是一个命令
      • fork 是在远程拉取一个与原代码库(A)一模一样的一个自己的库(B)。
      • 要想同步原代码库(A)到本地代码(C),则先绑定主机到本地
      • git remote add upstream https://github.com/原代码库/xxx.git
      • git remote add origin git@github.com:my/xxxx.git
      • 绑定完git fetch upstream 拉取原代码库(A)的代码
      • git merge upstream/master 将master分之代码同步到本地,然后可以进行修改
      • git push origin master 推到自己的代码库,之后再可以发起merge requset到原代码库

git tag

  1. git tag 查看所有tag
  2. git tag <tag name> 打一个tag
  3. git tag <tag name> <commitId> 在某一条commit上打tag
  4. git tag <tag name> -m <message> 打上tag并且添加message
  5. git push origin <tag name> 将tag push到远程
  6. git tag -d <tag name> 本地删除某个tag
  7. git push origin :refs/tags/<tag name> 远程删除tag

git 远程操作

  1. git remote add origin git@github.com:xxx.git 添加远程主机关联
  2. git remote prune origin --dry-run 看看有哪些没用的分支需要清除
  3. git remote prune origin 清除跟踪
  4. git push --set-upstream origin/master master 关联本地分之于远程分之
  5. git push -f 强制提交,尽量不要使用!!!!

git 提交部分文件或文件夹到别的分支

  1. 假设现在有个需求,要将master代码打包到dist文件夹中,这时候本地.gitignore忽略了dist文件夹,但是别的分支又需要这份dist打包好的项目。此时远程有master,本地也有master,再无别的分支。
  2. 本地git checkout -b other, git add -f dist, git commit -m "init other", git subtree push --prefix dist origin other 这样下来,other分支只有dist文件夹了。

本文作者原创,仅供学习交流使用,转载需注明出处。

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

推荐阅读更多精彩内容

  • 第一部分是文档,为了日后查看方便放到了前边[可能敲错了,详见阮一峰老师的文章]http://www.ruanyif...
    白璞1024阅读 1,020评论 0 49
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,649评论 9 163
  • 安装Git Git的下载地址:Git官网下载地址 Git本地仓库和命令 配置用户 下载完Git后,右键会有一个Gi...
    TokyoZ阅读 4,497评论 1 7
  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,412评论 0 7
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,950评论 3 27