git 常用命令集

初始化

工程初始化

  • git init demo 会直接生成demo的目录
  • mkdir demo && cd demo && git init

已追踪文件提交修改

  1. git add -u update更新已经追踪的文件,到本地仓库,相当于git add trackedFile
  2. git commit -m "haha" 提交
  3. git push 将修改推送到服务器

新增文件提交修改

  • git add newFile
  • git add -A 添加所有已经追踪的文件的更改
  • git add -f .gitignore中存在也强行添加到暂存区
  • git add -p 可以对比work 和index 间的区别,提供给用户对比后再提交部分确定的更新
  • git commit -m "haha"

git reset 重置一般针对暂存区操作

git reset [--soft|--hard|--mixed] <commit_id>

  • hard修改的步骤如下:
  1. 替换master(refs/master 文件所指向的commit_id)
  2. 替换暂存区的内容
  3. 替换工作区的内容 (这一步比较危险,会覆盖工作区)
  • soft 只执行第一步操作
  • mixed 执行 1 和 2 的操作,默认是mixed
  • git reset 相当于git reset --mixed HEAD . 默认是操作所有的文件,相当于放弃暂存区的修改
  • git reset -- filename 将filename文件的改动撤出暂存区,相当于git add filename的逆操作,双减号只是区分commit_id 和 文件名
  • git reset HEAD filename 效果如同git reset -- filename
  • git reset HEAD^ == git reset --mixed HEAD^ 放弃上一次的git add 操作
  • git reset --hard HEAD^ 彻底放弃上一次的更改

删除暂存区的修改

  • git rm --cache file

删除文件

  • git rm file 该命令会删除工作区和暂存区的文件,提交后版本库的文件才会删除

移动文件

  • git mv haha.txt README

例子

  • git reset --hard HEAD^ 重置到上一个老的提交分支上,该命令会破坏工作区未提交的的改动,慎用,该操作无法通过git log找回,git log 上不会保存该记录
  • git reflog show master 可以查看到git reset --hard的修改
  • git reset --hard master@{2} 可以找回git reset --hard的修改,master@{2}通过git reflog show master 找到

git checkout 检出,一般针对工作区操作

主要的三种用法

  • git checkout [<commit_id>] [--] <paths> 从某个commit_id 提取某个文件到当前工作区
  • git checkout BranchName 切换分支名
  • git checkout -b NewBranch [<start_point>] 创建新分支

分离头指针状态

  • 正常情况下,HEAD 都指向分支引用的文件,如:refs/heads/master,但是如果执行git checkout <commit_id>就会导致HEAD指向特定的commit_id的情况,这种现象就叫做“detached HEAD”,解决办法:git chekout -b <NewBranchName>
  • 如果没有在出现头指针的情况下,及时创建新分支,并且已经做了修改并提交,此时的提交并不会记录在之前的分支记录上,记录在断头的分支上,解决方法如下:
  1. 切换到要将该修改合并到哪个分支上: git checkout master
  2. 根据commit_id合并: git merge aacc87 commit_id 通过git log查看,断头模式的记录一般保存会有个超时时间,应尽早合并

git checkout 命令列表

  • git checkout == git checkout HEAD
  • git checkout -- filename 用暂存区中的文件替换工作区中的文件, file包含.git路径到文件的相对路径
  • git checkout master -- filename 用分支master中的filename覆盖工作区和索引区的文件
  • git checkout . == git checkout -- . 用暂存区的所有文件替换工作区文件
  • git checkout HEAD . 从版本库中获取文件覆盖暂存区和工作区的修改:
  • git checkout HEAD file 用版本库的文件覆盖暂存区和工作区
  • git checkout HEAD~1 -- haha.txt 星号相当于向前查找某个版本
  • git checkout hello-1.x 这边的hello1.x是远程分支的话,会创建和远程分支一样分支名的本地分支,会建立和远程分支的跟踪关系,如果是本地分支,则不会有跟踪关系
  • git checkout --track -b hello-1.x.bak hello.1.x 建立追踪关系,git pull 可以直接拉取更新
  • git checkout hello-1.x origin/hello-1.x 显示创建和远程分支一样名字的本地分支,会建立和远程分支的跟踪关系

git cherry-pick <commit_id> 改变版本历史,

git cherry-pick 应用一些已经存在的改变,如: A --》 B --》C --》D --》E --》F, 现在不要D了, 步骤如下:

  1. git checkout c 会导致处于detached HEAD模式
  2. 嫁接E: git cherry-pick master^
  3. 嫁接F: git cherry-pick master
  4. 断头模式处于为命名的分支,切换回master分支: git checkout master
  5. 用匿名分支的覆盖当前master分支,相当于为master分支迁移到了刚刚的匿名分支: git reset HEAD

git rebase 变基过程

命令格式

  • git rebase --onto <NewBase> <since> <till> 变基过程不包含<since>包含<till>,命令执行后HEAD --> till 过程如下:
  1. git checkout <till> 处于断头模式
  2. <since>...<till> 的提交保存到临时文件
  3. git reset --hard <newbase>
  4. 将临时文件的<since>...<till>从newbase节点,逐一更改提交
  5. 若冲突则需要人工处理冲突,再决定是否变基
  6. 整个过程都在断头模式的匿名分支中,最后将匿名分支的修改,应用到要实现变基过程的分支上:git checkout master --> git reset --hard <till>
  • git rebase --onto <NewBase> <since>
  • git rebase <since> <till>
  • git rebase <since>
  • git rebase --continue 变基过程若出现冲突,解决冲突(跟新到暂存区,不提交),继续执行变基
  • git rebase --skip 跳过冲突继续变基过程
  • git rebase --abort 回滚变基过程
  • git rebase -i <since> 交互过程,可以选择要应用提交,比较直观了解。显示的信息,是在<since>节点之后的所有提交,都是基于当前分支操作,所以省去了前两种变基过程复杂的命令参数。

之前案例的执行过程


辅助功能

比较工具diff

  • git diff 默认是比较work 和 index间的区别,如果执行git add之后,是看不到git diff比较的结果
  • git diff --cached 比较的是index 和 版本库间的区别,只有在git add 之后,还没commit之前能看到记录
  • git diff HEAD 工作区和版本库的比较
  • git diff HEAD^ HEAD [-- ./get_app_info/pipelines.py] 当前分支前一个版本和当前版本对比, 的某个文件, 想比较当前版本和前一个版本的去别,当前版本的参数放第二个位置

修改已经提交的日志

  • git commit - -amend
  • git rebase -i <commit_id> commit_id可以通过git log查看

git stash 工作区的应用

如果接到紧急的任务,需要从一个干净的工作区开始工作,或切换到别的分支工作,需要快速保存当前尚未完成的工作进度

  1. git stash == git stash save ‘message'
  2. git checkout <new_branch>
  3. 新的工作ing, 完成后
  4. git checkout <original_branch>
  5. git stash pop

命令

  • 显示工作区列表: git stash list
  • 删除工作区: git stash drop
  • 清空工作区: git stash clear
  • 基于进度创建分支: git stash branch <branchName> <stash>
  • git stash apply [--index] [<stash>] 如同pop,但是不删除stash list中的进度信息

git push

  • 强推本地分支覆盖远程分支: git push -f origin master:master

gitignore独享式

  • git config --global core.excludesfile /home/cdz/.gitignore 设置个人独享的gitignore文件
  • 或者在vi .git/info/execlude 创建文件

文件归档

如果用系统默认的归档工具,可能会将.git文件夹也打包进去

  • 基于最新的提交建立归档文件: git archive -o latest.zip HEAD
  • 归档个别目录: git archive -o latest.tar HEAD src doc
  • 基于里程碑v1.0建立归档,并且为归档中的文件添加目录前缀1.0: git archive --format=tar --prefix=1.0/ v1.0 | gzip > foo-1.0.tar.gz

查看相关信息命令

  • git grep "日志" 搜索版本库文件中包含日志的行
  • 显示版本库.git所在的目录: git rev-parse --git-dir
  • 显示工作区根目录: git rev-parse --show-toplevel
  • 显示相对工作区根目录的相对目录: git rev-parse --show-prefix
  • 解析引用对应的提交ID: git rev-parse master HEAD(head或refs/head/master)
  • 显示精简的修改信息: git status -s 输出格式: index work filename
  • git cat-file commit HEAD(master 66abkhde) 用于显示objects库的信息
  • git show <commit_id> 用于显示objects库的信息
  • git ls-files --with-tree=HEAD^ ls-files 用来显示index和work文件信息
  • git rev-list HEAD 查看本地提交列表
  • git ls-remote origin 查看远程提交列表
  • 文件追溯: git blame file 可以查看
  • git show-ref 查看引用列表,包含分支信息,tag信息,其实就是查看.git/refs文件的目录结构,相当于tree .git/refs

6652a0dce6a5067732c00ef0a220810a7230655e refs/heads/master
6652a0dce6a5067732c00ef0a220810a7230655e refs/remotes/origin/HEAD
6652a0dce6a5067732c00ef0a220810a7230655e refs/remotes/origin/master
c9b03a208288aebdbfe8d84aeb984952a16da3f2 refs/tags/A
1a87782f8853c6e11aacba463af04b4fa8565713 refs/tags/B

  • heads/ 存放的是分支
  • remotes/ 存放的远程分支
  • tags/存放的里程碑
  • git cherry -v origin/master~1 查找比上流分支更新的提交
  • git

git log命令

  • git log HEAD 只能查看当前分支日志
  • git log XXX 可以查看其它分支的日志

git clean 清除工作区中未追踪的文件,会删除没被追踪的文件

  • git clean -nd 测试真正执行git clean命令会删除哪些目录
  • git clean 最好别用

磁盘空间清理

  • git fsck 查看暂存区,引用游离的对象(这些游离的引用一般是有,已经add到暂存区,但是还没提交到版本库)
  • git prune 清除暂存区游离的对象,节省空间
  • 如果将错误的文件提交到版本库,通过 git reset --hard 回退版本 ,文件的引用还可以在reflog中找到引用,git prune无法清除,需要以下步骤才能清除:
  1. git reflog expire --expire=now --all now是一个日期,强制让now之前的记录全部过期,相当于清空reflog
  2. git prune 清理

复制本地git版本库

  • git clone ./demo demo1

将远程仓库的特定分支拉到本地

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