本笔记是跟距廖雪峰的Git网站写的学习笔记

Git安装和初始化

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

More info: 注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

创建版本库

  1. 首先,选择一个合适的地方,创建一个空目录
    1
    2
    3
    4
    $ mkdir learngit
    $ cd learngit
    $ pwd
    /Users/michael/learngit

More info:

  • pwd命令用于显示当前目录。在我的电脑上,这个仓库位于/Users/michael/learngit
    如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
  1. 通过git init命令把这个目录变成Git可以管理的仓库:

    1
    2
    $ git init
    Initialized empty Git repository in /Users/michael/learngit/.git/
  2. 编写一个readme.txt文件(一定要放到learngit目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。)

    1
    2
    Git is a version control system.
    Git is free software.
  3. 用命令git add告诉Git,把文件添加到仓库

    1
    $ git add readme.txt
  4. 用命令git commit告诉Git,把文件提交到仓库

    1
    2
    3
    4
    $ git commit -m "wrote a readme file"
    [master (root-commit) cb926e7] wrote a readme file
    1 file changed, 2 insertions(+)
    create mode 100644 readme.txt

more info

  • 简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
    6.为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
    1
    2
    3
    $ git add file1.txt
    $ git add file2.txt file3.txt
    $ git commit -m "add 3 files."

时光机穿梭

  1. 运行git status命令:git status命令可以让我们时刻掌握仓库当前的状态,下面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ git status
    # On branch master
    # Changes not staged for commit:
    # (use "git add <file>..." to update what will be committed)
    # (use "git checkout -- <file>..." to discard changes in working directory)
    #
    # modified: readme.txt
    #
    no changes added to commit (use "git add" and/or "git commit -a")
  2. 运行git diff命令:git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个“distributed”单词。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ git diff readme.txt
    diff --git a/readme.txt b/readme.txt
    index 46d49bf..9247db6 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -1,2 +1,2 @@
    -Git is a version control system.
    +Git is a distributed version control system.
    Git is free software.
  3. 提交

    1
    $ git add readme.txt
  • 同样没有任何输出。在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:

    1
    2
    3
    4
    5
    6
    7
    $ git status
    # On branch master
    # Changes to be committed:
    # (use "git reset HEAD <file>..." to unstage)
    #
    # modified: readme.txt
    #
  • git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了

    1
    2
    3
    $ git commit -m "add distributed"
    [master ea34578] add distributed
    1 file changed, 1 insertion(+), 1 deletion(-)
  • 提交后,我们再用git status命令看看仓库的当前状态

    1
    2
    3
    $ git status
    # On branch master
    nothing to commit (working directory clean)

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working directory clean)的。

版本回退

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 查看最近的提交日志
git log
// 查看每次操作
git reflog
// 回退到上一个版本
git reset --hard HEAD^
// 回退到上上个版本
git reset --hard HEAD^^
// 回退到n个版本
git reset --hard HEAD~n
// 回退到指定版本
// commit id 可用 git log 和 git reflog 查看
git reset --hard 'commit id'

撤销修改

1
2
3
4
5
6
7
8
// 撤销工作区修改
git checkout -- file
// 撤销暂存区
// 将暂存区撤回至工作区
git reset HEAD file
// 撤销版本(参考版本回退)

文件删除

1
2
3
4
5
6
7
8
// 删除工作区的文件
rm fileName
// 恢复工作区的文件
git checkout -- fileName
// 删除暂存区文件
git rm fileName

添加远程仓库

1、登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库

1
$ git remote add origin git@github.com:jolylai/新建仓库名.git

2、把本地库的所有内容推送到远程库上

1
2
3
4
5
6
7
8
9
$ git push -u origin master
Counting objects: 19, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (19/19), done.
Writing objects: 100% (19/19), 13.73 KiB, done.
Total 23 (delta 6), reused 0 (delta 0)
To git@github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.

  • 由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
  • 从现在起,只要本地作了提交,就可以通过命令
    1
    $ git push origin master

从远程库克隆

1、用命令git clone克隆一个本地库

1
2
3
4
5
6
7
8
9
$ git clone git@github.com:jolylai/要克隆的仓库名.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd gitskills
$ ls
README.md

分支管理

1、创建与合并分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 创建新分支
$ git branch dev
// 切换分支
$ git checkout dev
// 创建并切换至新分支
$ git checkout -b dev
// 查看所有分支
// 当前分支前面会加*号
$ git branch
// 合并分支
// 将dev分支合并到当前分支
$ git merge dev
// 删除分支
$ git branch -d dev

2、解决冲突

1
2
// 查看分支合并图
$ git log --graph

3、bug分支

1
2
3
4
5
6
7
8
9
10
11
// 将当前工作现场存储
$ git stash
// 查看存储列表
$ git stash list
// 恢复工作现场
// 恢复后不删除stash内容
$ git stash apply stash@{0}
// 恢复后删除stash内容
$ git stash pop

4、feature分支

1
2
// 强行删除未合并的分支
$ git branch -D <name>

5、多人协作

1
2
3
4
5
6
7
8
// 查看远程库信息
$ git remote
// 查看远程库更详细的信息
$ git remote -v
// 推送分支
$ git push origin <branchName>

  • 首先,可以试图用git push origin branch-name推送自己的修改;

  • 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

  • 如果合并有冲突,则解决冲突,并在本地提交;

  • 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream branch-name origin/branch-name。

6、标签管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 新建标签 默认HEAD
$ git tag <name>
// 新建标签至指定commotion id
$ git tag <name> <commit id>
// 查看标签
$ git tag
// 查看标签信息
$ git show <tagname>
// 创建带有说明的标签
$ git tag -a v0.1 -m 'info' <commit id>
// 删除标签
$ git tag -d <tagname>
// 推送标签到远程
$ git push origin <tagname>
// 一次性推送全部标签
$ git push origin --tags
// 删除远程标签
$ git tag -d <tagname>
$ git push origin:refs/tags/<tagname>

将项目推送到github pages

查看地址:用户名.github.io/项目名/
eg: jolylai.github.io/gallery-by-react/

1
git subtree push --prefix=dist origin gh-pages