Git使用手册

1. Git安装

git在Linux、MAC、Window上的安装步骤见google,安装完成后,配置用户名与邮箱

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

--global表示全局配置,如果想单独为该项目配置,不添加该参数

若想取消全局配置:

$ git config --global --unset user.name
$ git config --global --unset user.email

为不同项目配置不同的信息

修改配置后,如果想查看git配置文件:

$ cat ~/.gitconfig

也可以用:

$ git config user.name
或者
$ git config --global user.name

1.1 本文编辑器

Git 会使用操作系统默认的文本编辑器,通常是 Vim。 如果你想使用不同的文本编辑器,例如 Emacs,可以这样做:

$ git config --global core.editor emacs

如果你希望选择文本编辑软件,则:

$ git config --global core.editor="C:/'Program Files'/Notepad++/Notepad++.exe"

如果要删除默认文本编辑软件:

$ git config --unset  --global core.editor

1.2 配置信息检查

要检查已有的配置信息,可以使用 git config --list 命令:

$ git config --list

你可以通过输入 git config <key>: 来检查 Git 的某一项配置,例如:

$ git config user.name

如果想要需求git命令帮助,可以使用:

$ git help <verb>

例如,你想查看关于配置config的命令,可以

$ git help config

1.3 乱码信息处理

git bash终端也要设置成中文和utf-8编码。才能正确显示中文

在git bash的界面中右击空白处,弹出菜单,选择:Options->Text->Locale改为zh_CN,Character set改为UTF-8

status查看有改动但未提交的文件时总只显示数字串,显示不出中文文件名,这是因为中文文件名在工作状态传输,不能正确显示,处理方法:

$ git config --global core.quotepath false

2. Git版本库

2.1 创建版本库

首先选择一个地方,创建一个空目录

$ mkdir GitTest #创建一个GitTest的目录
$ cd GitTest
$ pwd

其中pwd用于显示当前目录

初始化仓库

$ git init

初始化后,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中,若想看见这个.git文件,则:

$ ls -ah

2.2 克隆版本库

如果想要获得一份已经存在的Git仓库拷贝,则需要用git clone命令,格式为git clone [url],例如:

$ git clone https://github.com/libgit2/libgit2

如果你想在本地自定义仓库名,可以使用:

$ git clone https://github.com/libgit2/libgit2 mylibgit #将远程仓库本地自定义名为mylibgit

2.3 推送仓库到远程

假设要连接到远程仓库(例如github):

判断是否在github上设置过SSH KEY,如果没有需要设置

创建SSH key

C盘用户目录下有没有.ssh目录,有的话看下里面有没有id_rsaid_rsa.pub这两个文件,有就跳到下一步,没有就通过下面命令创建

$ ssh-keygen -t rsa -C "youremail@example.com"

在用户下的.ssh目录里找到id_rsaid_rsa.pub这两个文件

添加SSH key

登陆github,在setting中选中SSH and GPG KEYS,选择new SSH key,把刚才id_rsa.pub里面的内容复制到Title下面的Key内容框里面

在github上创建一个仓库,在本地仓库运行命令

$ git remote add origin git@github.com:zhewendev/GitStudy.git

其中zhewendev/GitStudy.git换成自己的github账号名与仓库名

本地内容推送到远程仓库

$ git push -u origin master

(新建的远程仓库是空的,所以要加上-u这个参数,等远程仓库里面有了内容之后可以不加这个参数)

备注

创建远程仓库的时候,如果你勾选了Initialize this repository with a README,会报错,由于你新创建的那个仓库里面的README文件不在本地仓库目录中,需要先合并:

$ git pull --rebase origin master

之后再push就可以了

3. Git基础操作

image

3.1 提交流程

工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪

已跟踪的文件是指本来就被纳入版本控制管理的文件,而所有其他文件都属于未跟踪文件

确定当前目录哪些文件处于什么状态,可以用git status命令

git status

如果要跟踪(暂存)一个文件,使用git add命令

git add .  #跟踪当前工作目录下所有未跟踪文件

如果要跟踪指定文件,则在后面带上指定文件名,例如:

git add java.java

如果要查看指定文件修改的细节,可以使用git diff命令:

$ git diff java.java  #查看java.java这个文件的修改细节
diff --git a/java.java b/java.java
index f093797..0de4939 100644
--- a/java.java
+++ b/java.java
@@ -1,2 +1,2 @@
 hello world
-nice to meet you!
\ No newline at end of file
+nice
\ No newline at end of file

前述示例可以看到代码nice to meet you!被更改为nice

前述git status输出的状态较为详细,如果想要查看简单状态报告,可以使用git status -sgit status --short

$ git status -s #查看简单状态报告
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt
  • ??:表示未跟踪文件
  • A:表示新添加到暂存区
  • M:右边的表示文件修改未放入暂存区,左边表示修改并放入暂存区

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件

创建.gitignore文件

touch .gitignore

之后就可以在.gitignore文件中编辑需要忽略的文件了,其采用标准的glob模式匹配

文件 .gitignore格式规范如下

  • 所有空行或者以 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

glob模式即简化的正则表达式,详细语法规则可自行google查阅。

示例:在.gitignore编辑

*.[oa]  #忽略所有以.o或.a结尾的文件

查看已暂存的文件内容,可以使用git diff --staged命令

git diff --staged

暂存区保存妥当,可以提交,使用git commit命令

git commit -m"[D190920]提交java.java文件"

其中 -m后面带这次提交的注释,不可缺

如果觉得git add太繁琐,想一次提交已跟踪的文件,可以在git commit命令加 -a

git commit -a -m 'added new benchmarks'

移除文件,可以直接在文件管理器中将其删除,或者使用rm命令

git rm jjj.docx #移除jjj.docx文件

这个时候Git版本库还存在这个文件,可以git rm命令移除,然后提交

git rm jjj.docx
git commit -m"移除jjj.docx文件"

文件恢复:如果删错了,且还没有提交,可以将文件恢复

git checkout -- jjj.docx

git checkout其实是用版本库里的版本替换工作区的版本

移动文件或重命名,需要使用git mv命令

git mv jjj.docx test/ #将jjj.docx文件移动到test目录下

如果要重命名,示例:

git mv jjj.docx kkk.docx  #重命名

3.2 提交历史

查看提交历史,这个时候需要用到git log命令

git log

如果不带任何参数,则按提交时间列出所有更新。

可以在后面加各种参数,例如

git log -p -2 #最近两次提交和每次提交的内容差异

查看提交的简略统计,使用--stat选项

git log --stat

在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了

指定不同默认格式的方式展示提交历史,使用--pretty选项

$ git log --pretty=oneline

pretty后面还可以带shortfullfuller

定制显示记录格式,可以用git log --pretty=format命令

$ git log --pretty=format:"%h - %an, %ar : %s"

关于format后面选项写法与意义,参考:常用选项

关于git log后面携带的其他参数和各种参数的意义,可以参考前面的常用选项

一般使用git log --oneline查看log,简洁

3.3 撤销操作

提交信息修改:如果提交完发现有文件漏了或者提交信息错误时,可以运行带有 --amend 选项的提交命令尝试重新提交:

$ git commit --amend

版本回退

在Git中,用HEAD表示当前版本,即最新提交,上一个版本即HEAD^,以此类推,往上100个版本可以写成:HEAD~100

当前版本回退到上一个版本,使用git reset命令

$ git reset HEAD^

如果想要回退到指定的版本,reset后面带该版本的commitid即可

$ git reset 9abcfe5

git reset命令不带--hard参数则回退后当前的代码不会改变,如果带该参数,则代码等文件内容页回退到指定版本的内容

$ git reset --hard 9abcfe5

查看所有提交操作:git提供了git reflog命令记录每一次命令

$ git reflog

撤销add操作:如果你将某文件add后又后悔了,可以使用git reset HEAD命令

$ git reset HEAD jjj.docx

如果想撤销所有add的文件,则:

$ git reset HEAD

撤销文件修改:修改了某个文件但是又后悔了,想回退则:

$ git checkout -- jjj.docx

如果想想撤销工作区所有文件的修改,则:

$ git reset --hard HEAD

3.4 远程仓库操作

查看远程仓库,使用git remote命令

$ git remote

查看远程仓库使用的Git保存简写和对应URL,需要带上-v参数

$ git remote -v

查看某个远程仓库,使用git remote show [name]命令

$ git remote show origin

会列出远程仓库的 URL 与跟踪分支的信息等等

远程仓库重命名,使用git remote rename命令

$ git remote rename origin zhewendev

前述命令将origin远程仓库改为zhewendev了

3.5 标签操作

查看标签:查看所有已打标签,使用git tag命令:

$ git tag

如果只对某些标签感兴趣,可以使用特定模式查找,示例:

$ git tag -l 'v1.8.5*'

上述命令列出1.8.5 系列所有标签

创建标签:分为附注标签轻量标签

  • 附注标签:当你在运行 tag 命令时指定 -a 选项,示例:

    $ git tag -a v1.0.0 -m"my version 1.0"
    

    -m 选项指定了一条将会存储在标签中的信息。

    通过使用 git show 命令可以看到标签信息与对应的提交信息:示例:

    $ git show v1.0.0
    

    输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息

  • 轻量标签:轻量标签本质上是将提交校验和存储到一个文件中

    $ git tag v1.0.0
    
  • 后期创建标签:可以对过去提交打tag,假设提交历史为:

    5f558d4 (HEAD -> master, origin/master) java.java文件提交
    1053e9a 添加jjj.docx文件
    df163fe [D190920]提交java.java文件
    d61cc88 Initial commit
    

    你想在提交java.java文件这个提交之后打tag,可以:

    $ git tag -a v1.0.0 df163fe
    

共享标签:将标签推送到远程分支,默认不共享,示例:

$ git push origin v1.0.0

如果要一次性推送多个标签

$ git push origin --tags

删除标签:删除本地分支标签,使用git tag -d命令,示例:

$ git tag -d v1.4-lw

必须使用 git push <remote> :refs/tags/<tagname> 来更新你的远程仓库:

$ git push origin :refs/tags/v1.0.0

根据标签创建分支:通过git branch <new-branch-name> <tag-name>命令,示例:

$ git branch test_dev v1.0.0

3.6 配置别名

配置别名:可以通过 git config 文件来轻松地为每一个命令设置一个别名,示例:

$ git config --global alias.st status
$ git config --global alias.ci commit
$ git config --global alias.unstage 'reset HEAD'

git st表示git status命令,git ci表示git commit命令,git unstage 表示 git reset HEAD命令其他命令由此类推

--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。如果不加,那只针对当前的仓库起作用。

配置文件

每个仓库的Git配置文件都放在.git/config文件中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。

4. 分支操作

4.1 分支创建与合并

新建分支:使用git branch 命令,示例

$ git branch test_dev

切换分支:使用git checkout 命令,示例

$ git checkout test_dev

新建分支并切换

$ git checkout -b test_dev

分支合并:假设你在test_dev修改了问题,并切换到master分支,将test_dev分支合并到master中

$ git merge test_dev

分支删除:若想删除某个分支,可以用git branch -d命令,示例:

$ git branch -d test_dev

合并冲突:合并分支或者提交代码等情况可能存在冲突,情况可能如下:

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

这表示 HEAD 所指示的版本(也就是你的 master 分支所在的位置,因为你在运行 merge 命令的时候已经检出到了这个分支)在这个区段的上半部分(======= 的上半部分),而 iss53 分支所指示的版本在 ======= 的下半部分。 为了解决冲突,你必须选择使用由 ======= 分割的两部分中的一个,或者你也可以自行合并这些内容。

4.2 分支管理

展示分支:查看分支使用git branch命令

$ git branch

查看每一分支最后提交:使用git branch -v命令:示例

$ git branch -v

查看分支合并情况:查看哪些分支已经合并或未合并到当前分支,可以用--merged--no-merged 这两个有用的选项,若分支已删除则显示不出:

$ git branch --merged
$ git branch --no-merged

4.3 变基操作

rebase 命令将提交到某一分支上的所有修改都移至另一分支上,示例:

$ git checkout experiment
$ git rebase master

它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用

image

现在回到 master 分支,进行一次快进合并。

$ git checkout master
$ git merge experiment
image

备注:不要对在你的仓库外有副本的分支执行变基。

5. 其他技巧

模糊记忆快捷键: Ctrl + R,按Tab补充完整,按enter键直接回车执行,这里会显示之前输入过的命令。

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

推荐阅读更多精彩内容

  • 五、远程仓库的使用 为了能在任意 Git 项目上协作,你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网...
    常大鹏阅读 1,373评论 3 20
  • git 使用手册 版本:v1.0.3 初始日期:2020-10-18 最后修订日期:2022-05-18 官方文档...
    wcmszgdqm阅读 1,353评论 0 1
  • 一、电脑本地初始化一个仓库 1. git init: 初始化一个电脑上本地仓库 终端进入项目目录,输入: 该命令将...
    dragon_li阅读 2,936评论 1 4
  • 四、 分支开发工作流 现在你已经学会新建和合并分支,那么你可以或者应该用它来做些什么呢? 在本节,我们会介绍一些常...
    常大鹏阅读 2,105评论 3 24
  • Git常用命令 常用全局配置 配置用户信息 要配置成自己的真实用户名(姓名全拼)和邮箱 git config --...
    妞儿是只猫阅读 111评论 0 0