设置账户

  1. $ git config --global user.name "John Doe"
  2. $ git config --global user.email johndoe@example.com

SSH登录

  1. $ cd ~/.ssh
  2. $ ssh-keygen -o
  3. $ cat ~/.ssh/id_rsa.pub

初始化仓库

  1. $ mkdir git-learn
  2. $ cd git-learn
  3. $ git init

初始化成功后会生成 .git 目录,.git 目录存放着管理当前目录内容所需的仓库数据。
在git中我们将这个目录内容称为“附属于该仓库的工作树”,文件的编辑操作在文件树中进行,然后记录到仓库中。

查看仓库状态

  1. $ git status

文件树和仓库在被操作中,状态会经常发生改变,可以使用 git status 查看当前状态。
它会反映,文件新建、新的修改、新的提交、冲突等内容。

向暂存区中添加文件

$ touch README.md
$ git add README.md

被提交的文件会进入暂存区,暂存区是提交前的临时区域。
git仓库里新建的文件不会被标记到版本管理对象中,一旦将它加入暂存区,就会加入版本管理对象中,对的修改将会被记录。

清除暂存区所有文件

$ git rm --cached file_path

保存仓库的历史记录

记录一行提交信息

$ git commit -m 'frist commit'

-m 参数后面是提交信息,是对这个提交的描述。

记述详细提交信息

$ git commit

Git 命令 - 图1
(提交代码至暂存区)

这条命令会自动打开 vim 编辑器,在编辑器中格式如下:

  • 第一行:用一行文字简述提交的内容
  • 第二行:空行
  • 第三行:记述更改的原因和详细内容

记述完毕后使用 :wq 保存并关闭编辑器。
如果想终止提交,将提交信息留白并关闭编辑器。

查看提交后的状态

$ git status

Git 命令 - 图2
(查看日志)

显示全部提交信息

$ git log


commit 232c154f4f7e914947dc818f604a589dbbd7994a (HEAD -> master)
Author: hys1440248234 <xxxxxx@xx.com>
Date:   Mon Nov 19 11:04:27 2018 +0800

    frist commit

可以看出谁在什么时间提交的信息

只显示提交信息的第一行

$ git log --pretty=short

只显示指定目录、文件的日志

$ git log README.md

显示文件的改动

$ git log -p
$ git log -p README.md

查看更改前后的差别

$ git diff

显示工作树、暂存区、最新提交之间的差别。
“+”号标记的是新添加的行,被删除的用“-”号标记。

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

$ git diff HEAD

一个好习惯:在每次执行 git commit 前执行 git diff HEAD 查看本次提交与上一次的区别,等确认后再提交。

分支的操作

在并行开发时,往往会存在多个最新代码状态。
每个分支都有其最新的代码,master 是 git 默认的主分支。

从 master 分支创建 feature-A 和 fix-B 分支:
创建 feature-A 和 fix-B 分支
不同分支可以完成不同作业,等完成后再合并。
灵活的运用分支可以使得多人同时高效的进行并行开发。

显示分支一览表

$ git branch

* 的是当前所在分支。

分支的创建、切换

创建分支 feature-A:

$ git checkout -b feature-A

切换分支 feature-A:

$ git checkout feature-A

也可以使用以下命令切换回上一个分支:

$ git checkout -

修改 README.md 文件再切换回 master 分支,你会发现 README.md 还是修改前的样子,也就是说各个分支的修改不相互影响。

设置默认分支

dev 为默认分支

$ git push --set-upstream origin dev

特征分支

集中实现某一特征(主题),除此之外不再进行任何作业的分支

在日常开发中会创建无数个特征分支,同时再此之外保留一个可以随时发布的稳定分支(通常是 master )。
每个分支只完成其当前的功能,即使出现了 BUG ,也需要新建新的分支,在新的分支下修正。

分支合并

$ git checkout master
$ git merge --no-ff feature-A

以图表形式查看分支

$ git log --graph

回溯历史版本

$ git reset --hard a94784276b2d03832e77a43556fee8785b47889c

查看当前仓库执行过的操作的日志

$ git reflog

提交修改信息

$ git commit --amend

压缩历史-变基

合并分支前发现提交的内容有错误,先提交一个修改,再将这个修改包含到前一个提交中,压缩成一个历史记录。

$ git rebase -i

这部分内容可以看 Git 分支 - 变基

远端服务器

仓库名与本地保持一致。
创建时不勾选 README 选项,避免重名文件的名字覆盖。

添加到远程服务器

$ git remote add origin https://github.com/hys1440248234/git-learn.git

推送到远端

main 分支(新的默认分支):

$ git branch -M main
$ git push -u origin main

main 分支之外的分支:

$ git checkout -b feature-D
$ git push -u origin feature-D

从远程仓库获取

master 分支:

$ git clone https://github.com/hys1440248234/git-learn.git

master 分支之外的分支:

$ git checkout -b feature-D origin/feature-D
$ git clone https://github.com/hys1440248234/git-learn.git

获取最新的远程分支:

$ git pull origin feature-D

删除远程分支

$ git push origin -d feature-D
$ git branch -D feature-D

修改已经提交的记录

$ git rebase -i HEAD~3
# 如果你要修改哪个,就把那行的pick改成edit,然后保存退出
$ git commit --amend
$ git rebase --continue

.gitignore规则不生效

.gitignore 只能忽略那些原来没有被 track 的文件,如果某些文件已经被纳入了版本管理中,则修改 .gitignore 是无效的。

解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

git rm -r --cached FilePath
git add FilePath
git commit -m 'update .gitignore for ignore FileName'

参考

【1】GitHub 入门与实践
【2】猴子都能懂的Git入门