Git使用

安装

apt install git

使用

  • windows 右键打开git bash。
  • Ubuntu 打开terminal
    查看帮助命令,会在默认浏览器中打开对应命令的本地帮助手册:
git help command
# or
git command --help

Create

新建一个本地仓库git init会把当前文件作为git的仓库
克隆一个远程仓库git clone repourl把当前文件夹作为git的仓库克隆远程的仓库到本地
两者都会自动创建一个名为master的本地分支。

Update

在git中,所有文件都分为三种状态

  • 已修改
    文件被修改了,还没提交到暂存区。修改状态包括,modified,new file,delete
  • 已暂存
    文件被提交到暂存区,即被放到了下次将提交的清单中,下次做提交时将会提交这些文件。
  • 已提交
    已修改的文件被安全提交到了本地仓库中了。

添加修改到暂存区

# 添加单个文件
git add filename
# 添加全部文件,"."代表当前文件夹,将当前文件夹加入即代表添加全部文件
git add .

提交暂存区文件到本地仓库

# 交互式,会弹出提交信息编辑界面
git commit
# 直接添加信息
git commit -m "commit msg"
# 当目前没有新增文件时(即所有文件之曾被add过),可以add文件,直接使用下面的命令
git commit -a -m (可合并写为-am) "commit msg"

修改提交

  • 修改最后一次提交
git reset --hard HEAD^

# 此命令的作用是将HEAD移动到当前HEAD所指向记录的前一条记录,主要参数有三个
# --mixed(默认),会将当前HEAD和HEAD^的差异放到工作区中,如果当前工作区中有内容,会将其混合在一起
# --hard 抛弃当前HEAD和HEAD^的差异,起到重置效果
# --soft 将当前HEAD和HEAD^的差异放到暂存区中
  • 修改任意一次提交(删除提交,改变提交顺序,分拆提交,压缩提交)
git rebase -i commitref

# 以交互模式对指定修改变基,比如git rebase -i HEAD~3,修改前面三次的提交,反馈如下

pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file

# Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

# pick表示采用该次提交
# edit表示会编辑该次提交,当逐一应用每次提交到该次时,会把该次提交恢复到工作区,再自由提交(可拆分提交)
# squash表示压缩该次提交,和上一个pick的提交压缩为一次提交,可连续squash连续压缩为一次
# 该顺序代表了应用提交的顺序,可以修改顺序。删除改行,表示弃用该次提交

edit 310154e updated README formatting and added blame
squash f7f3f6d changed my name a bit

# 这样的修改表示,将第二次与第一次提交交换顺序
# 并编辑第二次修改
# 将第一次的提交和编辑后的第二次提交压缩为一次提交
# 删除第三次提交
  • 拣选提交,从其他分支上拣选需要的提交到本地分支来,并不直接rebase
# 拣选提交
git cherry-pick commitref
  • 抵消提交,在commit中提交一次和该应该用相反的修改,抵消该次修改的效果。
git revert commitref

撤销操作

  • 撤销工作区修改
## 不加"--"可能会有歧义,如果有文件同名分支,则会迁出到该分支

git checkout -- filename
  • 撤销暂存区修改
git reset HEAD filename

examine

  • 查看当前状态
git status
  • 查看分支
git branch
  • 查看区别
# 工作区和暂存区不同
git diff

# 查看暂存区和上次提交不同
git diff --staged

# 查看工作区和上次提交不同
git diff HEAD
  • 查看提交
# 查看某个commit
git show commitred

# 查看某个commit具体文件
git show commitref filename
  • 查看提交历史
# 详细改动
git log -p

# 大致改动
git log --stat commitref

# 图形显示
git log --graph

# 查看单词级别的改动,U1指改动的上下文为一行,默认3,必须搭配U使用才能显示,新增单词用{++}括起来,删除单词用[--]
git log -U1 --word-diff

# 显示格式控制(长短) --pretty等价于命令--format
git log --pretty=oneline|short|medium|full|fuller|raw
# 显示格式控制(内容) %Cred-从此将输出颜色改为红色,%h-6位hash,%Cgreen-改为绿色,%Creset重置颜色,%n-换行
git log --pretty="%Cred%h %Cgreen%an %n %Creset%cD %n %C(#ff9900)%s %n"
# 将40位的SHA1值显示为6位
git log --abbrev-commit
# 等价于 --pretty=oneline --abbrev-commit
git log --oneline

# 查看前n个记录
git log -n
# 查看截止到commitref的提交历史
git log commitref
# 显示截至日期以后的记录 --since等价于--after
git log --after=24.hours
# 显示截至日期以前的记录 --until等价于--before
git log --before=3.days
# 限制最小父节点数量, =2时等价于命令--merge
git log --min-parents=2
# 限制最大父节点数量, =1时等价于命令--no-merge
git log --max-parents=1

branch and tag

  • 分支 branch
# 查看分支 *指代当前分支
git branch

# 查看分支简要信息
git branch -v

# 查看已经被合并到当前分支的分支(即在本分支的上游)
git branch --merged

# 查看未被合并到当前分支的分支(即查看未合并的工作分支)
git branch --no-merged

# 新建分支
git branch branchname

# 切换分支
git checkout branchname

# 新建并切换到该分支
git checkout -b branchname

# 合并分支,将branchname分支合并到当前分支
git merge branchname

# 删除分支,-D强制删除,抛弃分支上未合并的修改
git branch -d branchname

# 将HEAD指向当前commit,和当前branch分离
git branch --detach
  • 标签 Tag
# 显示标签,注:标签按字母顺序排序
git tag

# 轻量级标签
git tag tagName

# 打一个含注释标签,不着不用-m命令,交互式打标签
git tag -a tagName -m "tag msg"

# 显示标签信息
git show tagName

# 后期加注标签
git tag tagName commitref

# 删除标签
git tag -d tagName

# 推送标签到远程仓库,注:push不会推送tag,tag需要手动推送
git push remoteRepoName tagName
# 推送全部标签
git push remoteRepoName --tags

remote repo

# 查看远程仓库名
git remote

# 查看远程仓库简要信息
git remote -v

# 显示某个远程仓库信息
git remote show remoteRepoName

# 添加远程仓库
git remote add remoteRepoName remoteRepoUrl

# 重命名远程仓库
git remote rename oldName newName

# 删除远程仓库
git remote rmremoteRepoName

# 获取远程仓库数据,将远程数据镜像到本地,默认名字是origin,分支名为origin/branchName
git fetch

# 跟踪某个远程分支
git branch --set-upstream remoteRepoName/branchName
# 从远程分支迁出,自动跟踪这个分支
git checkout -b branchName remoteRepoName/branchName
# 拉取远程分支,fetch远程分支,并将tracked remote分支merge本地当前分支,后面加分支名表示拉取指定分支并merge到当前分支
git pull
# 重置跟踪远程分支
git branch --unset-upstream
# 推送到远程同名分支
git push(已track同名远程分支)
git push remoteRepoName branchName
# 推送到远程分支并关联,-u等价于--set-upstream,如果branchName=remoteBranchName,下次可直接git push
git push -u remoteRepoName branchName:remoteBranchName

Stash

储藏工作。当遇到需要紧急切换分支等情况,而当前的工作不足以做一次提交时,可以使用stash储藏当前工作,切换到另外的分支,完成工作再回到当前分支,取出储藏的工作,继续工作。也可以将当前工作区的工作储藏起来,到另外的分支取去来使用。

# 储藏工作
git stash

# 查看储藏的工作列表
git stash list

# 应用最近一次储藏
git stash apply
# 应用最后一次储藏,并从列表中删除
git stash pop
# 应用指定储藏
git stash apply stashref
# 以上的应用类似于 reset --mixed效果,将之前的暂存区和工作区更改混合后放到工作区,--index可原样恢复
git stash apply --mixed

# 删除指定的储藏
git stash drop stashref

# 取消应用的stash,没有unstash命令,但是可以曲线救国,以补丁的方式显示stash的内容,并把内容输出到apply命令以-R(reverse)方式应用。
git stash show -p | git apply -R

filter-branch

filter-branch该命令通过对提交树应用自定义的分支达到对提交记录的修改。

# 从所有提交中删除一个文件
git filter-branch --tree-filter 'rm -f fileName' HEAD

# 对符合条件的修改提交做修改,--all选项用于指定所有分支,需要和前面的命令用```--```分隔开来
git filter-branch --commit-filter '
        if [ "$GIT_AUTHOR_NAME" = "dhy" ];
        then
                GIT_AUTHOR_NAME="chdhy";
                GIT_AUTHOR_EMAIL="chdhy@example.com";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' -- --all

# 删除修改过后系统留下的/original/refs/heads/branchname,即原提交的记录
# 删除指定分支记录
git update-ref -d refs/original/refs/heads/branchname
# 删除所有分支记录
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

Syntax

  • ^ 与某个提交记录合用,跟在其后面,可以是HEAD,hash值,HEAD^^^表示当前提交记录的往前的第三次记录
  • ~ 与^作用类似,用法为跟在其后面加数字,HEAD~8表示当前提交记录往前的第8次记录
  • .. 指明范围语法,git log master..dev表示从master分支出发,不包含master分支的提交记录。可以用来查看自上次推送远程仓库后再本地做的提交记录git log origin/dev..devorigin/master....不跟记录默认使用HEAD代替不存在的一边。
  • --not 或 前置^ 表示不包含
# 三个命令等价
git log refA..refB
git log ^refA refB
git log refB --not refA
  • ... 指代两者各自独有的部分,可以显示两个分支分叉的部分,配合特定命令调节符显示效果很清晰,<表示记录归属...左边的记录,>表示右边。
$ git log --left-right --oneline test2...test
< 57cb468 一个买不起
> 374db5a add code.txt
> 2546519 买不起,add code
> 5d5d530 let it go 买买买

.gitignore

.gitignore文件放在工作目录的顶层,让git忽略里面规定的文件类型,不做提交。参考如下:

# 忽略所有.txt文件
*.txt

# 除了note.txt
!note.txt

# 忽略'!a.do'这个文件
\!a.do

# 忽略build文件夹及其下的文件,但不包括根目录下的名字为'build'的文件
build/

# 忽略gen文件和gen文件夹,同/gen
gen

# 忽略bin目录下的直接子.class文件,如果其下还有文件夹,其子文件夹下的.class文件不会被忽略
gen/*.class

# 忽略log文件夹下的所有.log文件,包括其子文件夹下的文件,**包含文件夹下的所有文件夹
gen/**/*.log

# git默认不会添加空文件夹,可在空文件夹中加入文件.gitkeep强制添加空文件夹

# 其他基本过滤规则
* ?:代表任意的一个字符
* *:代表任意数目的字符
* {!ab}:必须不是此类型
* {ab,bb,cx}:代表ab,bb,cx中任一类型即可
* [abc]:代表a,b,c中任一字符即可
* [ ^abc]:代表必须不是a,b,c中任一字符

git config

git配置,一共有三种。

  • 1..git/config文件,用于针对项目范围内的配置
  • 2.~/.gitignore文件,用于针对用户全局配置
  • 3./etc/gitconfig文件,Linux下针对所有用户的配置
# 查看用户配置,--global只看用户级的,默认看全部
git config --list

# 配置全局用户名
git config --global user.name "chdhy"

# 配置项目用户邮箱
git config user.email chdhy@qq.com

# 配置用户默认编辑器
git config --global core.editor vim

# 配置用户diff工具
* git config --global merge.tool vimdiff

# 配置全局命令别名
git config --all alias.com commit
git config --all alias.che chekout
git config --all alias.bra branch
git config --all alias.sta status
git config --all alias.rem remote
git config --all alias.fet fetch
git config --all alias.mer merge
git config --all alias.reb rebase
git config --all alias.res reset
git config --all alias.rev revert

# 利用别名创造新命令
git config --all alias.logo 'log --oneline'
git config --all alias.coma 'commit -am'

其他命令

# 查看git的HEAD的引用变化记录
git reflog

# 制作简报,显示从v1.0.1以来的提交记录,按author分类
git shortlog --no-merges master --not v1.0.1

参考:

  1. https://www.jianshu.com/p/fe76f2890a14
  2. https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
  3. http://www.ruanyifeng.com/blog/2012/07/git.html
  4. https://github.com/github/gitignore/blob/master/Android.gitignore
  5. http://www.infoq.com/cn/news/2011/01/git-adventures-1?utm_source=news_about_git-adventures&utm_medium=link&utm_campaign=git-adventures
  6. https://blog.haohtml.com/archives/15965
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容

  • 一、电脑本地初始化一个仓库 1. git init: 初始化一个电脑上本地仓库 终端进入项目目录,输入: 该命令将...
    dragon_li阅读 2,859评论 1 4
  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,847评论 5 147
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,941评论 3 27
  • 我是梧桐树上的一片叶, 偶尔出现在人们关心的边缘, 我发芽,我绿得发油, 我凋落,...
    吾契瑜阅读 327评论 3 10
  • 画质渣,为截图 原图 正准备给小兔子剪草的时候出门照的,所以有把剪刀,哈哈~ 小兔子在此
    兔小四阅读 359评论 0 2