Mac Git命令

Git初始设置

设置使用Git时需要的用户名和邮箱

$ git config --global user.name 'Firstname Lastname'
$ git config --global user.email "your_email@example.com"

初始化仓库

$ mkdir myApp
$ cd myApp
$ git init
Initialized empty Git repository in /Users/INST/Desktop/myApp/.git/

如果初始化成功,执行了 git init命令的目录下就会生成 .git 目 录。这个 .git 目录里存储着管理当前目录内容所需的仓库数据。
在 Git 中,我们将这个目录的内容称为“附属于该仓库的工作树”。 文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件 的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前 的快照,在工作树中打开。开发者可以通过这种方式获取以往的文件。 具体操作指令我们将在后面详细解说。

查看仓库的工作状态

$ git status
On branch master

Initial commit

结果显示了我们当前正处于 master 分支下。关于分支我们会在不久 后讲到,现在不必深究。接着还显示了没有可提交的内容。所谓提交
(Commit),是指“记录工作树中所有文件的当前状态”。 尚没有可提交的内容,就是说当前我们建立的这个仓库中还没有记 录任何文件的任何状态。

向暂存区中添加文件

如果只是用 Git 仓库的工作树创建了文件,那么该文件并不会被记 入 Git 仓库的版本管理对象当中。因此我们用 git status命令查看 README.md 文件时,它会显示在 Untracked files 里。
要想让文件成为 Git 仓库的管理对象,就需要用 git add命令将其 加入暂存区(Stage 或者 Index)中。暂存区是提交之前的一个临时区域。

$ git add README.md 
$ git status
# On branch master
  将 README.md 文件加入暂存区后,git 果发生了变化。可以看到,README.md文件显示在Changes to be committed 中了。

保存仓库中的历史记录

git commit命令可以将当前暂存区中的文件实际保存至历史记录中,通过这些记录,我们可以从工作树中复原文件
$ git commit -m "First commit"
[master (root-commit) c968230] First commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
-m 参数后的 "First commit"称作提交信息,是对这个提交的概述。

记述详细提交信息

刚才我们只简洁地记述了一行提交信息,如果想要记述得更加详细,请不加- m,直接执行gitcommit命令。执行后编辑器就会启动,并显示如下结果。
$ git commit
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master #
# Initial commit
  #
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage) #
# new file: README.md
#

在编辑器中记述提交信息的格式如下:

  1. 第一行:用一行文字简述提交的更改内容
  2. 第二行:空行
  3. 第三行以后:记述更改的原因和详细内容

只要按照上面的格式输入,今后便可以通过确认日志的命令或工具 看到这些记录。
在以 #(井号)标为注释的 Changes to be committed(要提 交的更改)栏中,可以查看本次提交中包含的文件。将提交信息按格式 记述完毕后,请保存并关闭编辑器,以 #(井号)标为注释的行不必删 除。随后,刚才记述的提交信息就会被提交。

查看提交日志

git log命令可以查看以往仓库中提交的日志,包括什么人什么时候进行了提交和合并,以及操作之后有何区别。
$ git log
commit 2c2ee0223f54c7512245f7ab3da5ad7e1bbfb30a
Author: Firstname Lastname <your_email@example.com>
Date:   Fri Aug 11 09:37:56 2017 +0800

    第一行简单文字描述
    //空格
    只是一个小小的测试
    文本

commit c968230beadd590903ee2645387d833596fb0fca
Author: Firstname Lastname <your_email@example.com>
Date:   Fri Aug 11 09:30:42 2017 +0800

    First commit

INSTdeiMac:myApp Andy$ git log --pretty=short     // 只显示提交信息的第一行
commit 2c2ee0223f54c7512245f7ab3da5ad7e1bbfb30a
Author: Firstname Lastname <your_email@example.com>

    第一行简单文字描述

commit c968230beadd590903ee2645387d833596fb0fca
Author: Firstname Lastname <your_email@example.com>


$ git log README.md                                 // 只显示单个文件、目录日志
commit c968230beadd590903ee2645387d833596fb0fca
Author: Firstname Lastname <your_email@example.com>
Date:   Fri Aug 11 09:30:42 2017 +0800

    First commit

显示文件的改动

如果想要查看提交所带来的改动,可以加上参数- p,文件的前后差别就会显示在提交信息中
$ git log -p README.md
commit c968230beadd590903ee2645387d833596fb0fca
Author: Firstname Lastname <your_email@example.com>
Date:   Fri Aug 11 09:30:42 2017 +0800

    First commit

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..421ac42
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# git教程
\ No newline at end of file

查看暂存区和工作树之间的差别

 git diff
diff --git a/README.md b/README.md index e69de29..cb5dc9f 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@ +# Git教程
由于我们尚未用git只会显示工作树与最新提交状态之间的差别。

add命令向暂存区添加任何东西,所以程序只会显示工作树与最新提交状态之间的差别。

查看工作树和最新提交的差别

如果现在执行 git diff命令,由于工作树和暂存区的状态并无 差别,结果什么都不会显示。要查看与最新提交的差别,请执行以下 命令。

$ git diff HEAD
diff --git a/README.md b/README.md index e69de29..cb5dc9f 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1 @@
+# Git教程

不妨养成这样一个好习惯:在执行 g i t
git diff HEAD命令,查看本次提交与上次提交之间有什么差别,等 确认完毕后再进行提交。这里的 HEAD 是指向当前分支中最新一次提交 的指针。

分支操作

显示分支一览表

```
$ git branch
* master  //当前只有master分支
```

创建和切换分支

```
$ git checkout -b Feature-A

$ git branch
* Feature-A
 master

```

切换回上一个分支

```
$ git checkout -
Switched to branch 'master'
```

像上面这样用“-”(连字符)代替分支名,就可以切换至上一个分 支。当然,将“-”替换成 feature-A 同样可以切换到 feature-A 分支。

feature-A 分支左侧标有“*”,表示当前分支为 feature-A。在这个状 态下像正常开发那样修改代码、执行 g i t a d d命令并进行提交的话, 代码就会提交至 feature-A 分支。像这样不断对一个分支(例如 feature-A)进行提交的操作,我们称为“培育分支”。

分支合并

接下来,我们假设 feature-A 已经实现完毕,想要将它合并到主干分 支 master 中。首先切换到 master 分支。
    ```
    $git checkout -  //回到主分支
    Switched to branch 'master'
    
    ```

然后合并 feature-A 分支。为了在历史记录中明确记录下本次分支合 并,我们需要创建合并提交。因此,在合并时加上 --no-ff参数。
```
$ git merge --no-ff feature-A
```

以图标的方式查看分支

$ git log --graph
  • 更改提交的操作,回溯历史版本

    Git 的另一特征便是可以灵活操作历史版本。借助分散仓库的优势, 可以在不影响其他仓库的前提下对历史版本进行操作。要让仓库的 HEAD、暂存区、当前工作树回溯到指定状态,需要用 到git rest --hard命令。只要提供目标时间点的哈希值A,就可以完全恢复至该时间点的状态。事不宜迟,让我们执行下面的命令

$ git reset --hard fd0cbf0d4a25f747230694d95cac1be72d33441d 
HEAD is now at fd0cbf0 Add index

查看当前仓库执行了哪些操作

$ git reflog
1e4e49d HEAD@{0}: reset: moving to 1e4e49d843f9e23c9665015c520349ec03cf0406
0638c04 HEAD@{1}: reset: moving to HEAD
0638c04 HEAD@{2}: merge feature-A: Merge made by the 'recursive' strategy.
2c2ee02 HEAD@{3}: checkout: moving from Feature-A to master
1e4e49d HEAD@{4}: checkout: moving from master to Feature-A
2c2ee02 HEAD@{5}: checkout: moving from Feature-A to master
1e4e49d HEAD@{6}: commit: Add feature-A
2c2ee02 HEAD@{7}: checkout: moving from master to Feature-A
2c2ee02 HEAD@{8}: checkout: moving from Feature-A to master
2c2ee02 HEAD@{9}: checkout: moving from master to Feature-A
2c2ee02 HEAD@{10}: commit: 第一行简单文字描述
c968230 HEAD@{11}: commit (initial): First commit

消除冲突

$ git merge --no-ff fix-B
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Recorded preimage for 'README.md'
Automatic merge failed; fix conflicts and then commit the result.

查看冲突部分并将其解决

  # Git教程
   <<<<<<< HEAD - feature-A
   =======
   - fix-B
   >>>>>>> fix-B
======= 以上的部分是当前 HEAD 的内容,以下的部分是要合并 的 fix-B 分支中的内容。我们在编辑器中将其改成想要的样子。
# Git教程
- feature-A
- fix-B

压缩历史

```
$ git checkout -b feature-C
Switched to a new branch 'feature-C'
```

推送至远程仓库

添加远程仓库

$ git remote add origin git@github.com:github-book/git-tutorial.git

按照上述格式执行git remote add命令之后,Git会自动将 git@github.com:github-book/git-tutorial.git远程仓库的 名称设置为 origin(标识符)。

推送至远程仓库
推送至 master 分支
如果想将当前分支下本地仓库中的内容推送给远程仓库,需要用到 git push命令。现在假定我们在master分支下进行操作。

$ git push -u origin master

像这样执行git push命令,当前分支的内容就会被推送给远程仓库 origin 的 master 分支。-u参数可以在推送的同时,将 origin 仓库的 master 分 支设置为本地仓库当前分支的 upstream(上游)。添加了这个参数,将来 运行 git pull命令从远程仓库获取内容时,本地仓库的这个分支就可 以直接从 origin 的 master 分支获取内容,省去了另外添加参数的麻烦。执行该操作后,当前本地仓库 master 分支的内容将会被推送到 GitHub 的远程仓库中。在 GitHub 上也可以确认远程 master 分支的内容和本地 master 分支相同。
其他分支也是一样

注意:这个时候肯能会报错,主要原因是远程仓库中的README.md文件不在本地仓库中。

  • 方案一 我们只需加上 -f 参数即可push成功 git push -f
  • 方案二
git pull --rebase origin master           
git push -u origin master

获取远程仓库

$ git clone git@github.com:github-book/git-tutorial.git

执行 git clone命令后我们会默认处于 master 分支下,同时系统 会自动将 origin 设置成该远程仓库的标识符。也就是说,当前本地仓库 的 master 分支与 GitHub 端远程仓库(origin)的 master 分支在内容上是 完全相同的。

$ git branch -a * master
remotes/origin/HEAD -> origin/master remotes/origin/feature-D remotes/origin/master

我们用 git branch -a命令查看当前分支的相关信息。添加 -a 参数可以同时显示本地仓库和远程仓库的分支信息。
结果中显示了 remotes/origin/feature-D,证明我们的远程仓库中已经 有了 feature-D 分支。

获取远程的feature-D分支

$ git checkout -b feature-D origin/feature-D
Branch feature-D set up to track remote branch feature-D from origin. Switched to a new branch 'feature-D'
  • b 参数的后面是本地仓库中新建分支的名称。为了便于理解,我 们仍将其命名为 feature-D,让它与远程仓库的对应分支保持同名。新建 分支名称后面是获取来源的分支名称。例子中指定了 origin/feature-D, 就是说以名为 origin 的仓库(这里指 GitHub 端的仓库)的 feature-D 分 支为来源,在本地仓库中创建 feature-D 分支。

推送 feature-D 分支

$ git push
Counting objects: 5, done.
Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes, done. Total 3 (delta 1), reused 0 (delta 0)
To git@github.com:github-book/git-tutorial.git
ca0f98b..ed9721e feature-D -> feature-D

从远程仓库获取 feature-D 分支,在本地仓库中提交更改,再将 feature-D 分支推送回远程仓库,通过这一系列操作,就可以与其他开发 者相互合作,共同培育 feature-D 分支,实现某些功能

获取最新的远程仓库分支

现在我们放下刚刚操作的目录,回到原先的那个目录下。这边的本
地仓库中只创建了 feature-D 分支,并没有在 feature-D 分支中进行任何提交。然而远程仓库的 feature-D 分支中已经有了我们刚刚推送的提交。 这时我们就可以使用git pull命令,将本地的feature-D分支更新到最新 状态。当前分支为 feature-D 分支。

$ git pull origin feature-D
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (1/1), done. remote: Total 3 (delta 1), reused 3 (delta 1) Unpacking objects: 100% (3/3), done.
From github.com:github-book/git-tutorial
* branch feature-D -> FETCH_HEAD
First, rewinding head to replay your work on top of it... Fast-forwarded feature-D to ed9721e686f8c588e55ec6b8071b669f411486b8.

GitHub 端远程仓库中的 feature-D 分支是最新状态,所以本地仓库 中的 feature-D 分支就得到了更新。今后只需要像平常一样在本地进行提 交再 push 给远程仓库,就可以与其他开发者同时在同一个分支中进行 作业,不断给 feature-D 增加新功能。
如果两人同时修改了同一部分的源代码,push 时就很容易发生冲 突。所以多名开发者在同一个分支中进行作业时,为减少冲突情况的发 生,建议更频繁地进行 push 和 pull 操作

  • 删除本地仓库

就是删除文件夹下面的.git文件

find . -name ".git" | xargs rm -Rf

学习资料
1.《Github入门与实践》

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

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,615评论 9 163
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,437评论 1 26
  • 三、竹林七贤与荣启期 其实,“竹林七贤”砖画,不仅只是“竹林七贤”,画上还有一位人物,即荣启期,故“竹林七贤”砖画...
    聆听万籁阅读 1,737评论 4 8
  • 这个是我学习单片机时候做的第一个东西,现在看来似乎一点技术含量都没有,但每一个人都是从没有技术含量开始的,毕竟谁也...
    Snowywind阅读 6,029评论 1 3
  • git常用指令汇总 初始化本地仓库 命令:git init 克隆远程仓库 命令:git clone 远程仓库 添加...
    fancypy阅读 146评论 0 0