创建版本库 (init)

我们先要确定要把哪个文件夹里的文件进行管理. 比如说我桌面上的一个叫 gitTUT 的文件夹. 然后在 Terminal (Windows 的 git bash) 中把当前目录调到这个文件夹 gitTUT, 我的做法是这样:

$ cd ~/Desktop/gitTUT

为了更好地使用 git, 我们同时也记录每一个施加修改的人. 这样人和修改能够对应上. 所以我们在 git 中添加用户名 user.name 和 用户 email user.email:

$ git config --global user.name "Yuan"

$ git config --global user.email "yuan@email.com"

在这个文件夹中建立 git 的管理文件了:

$ git init

添加文件管理 (add)

建立一个新的 1.py 文件:

$ touch 1.py

现在我们能用 status 来查看版本库的状态:

$ git status

现在 1.py 并没有被放入版本库中 (unstaged), 所以我们要使用 add 把它添加进版本库 (staged):

$ git add 1.py

如果想一次性添加文件夹中所有未被添加的文件, 可以使用这个:

$ git add .

提交改变 (commit)

我们已经添加好了 1.py 文件, 最后一步就是提交这次的改变, 并在 -m 自定义这次改变的信息:

$ git commit -m "create 1.py"

在 git 中, 每一次提交(commit)的修改, 都会被单独的保存起来. 也可以说 git 的中的所有文件都是一次次修改累积起来的. 文件好比楼房, 每个 commit 记录了盖楼需添加或者拿走的材料. 整个施工过程也被记录了下来.

修改记录 log

之前我们对版本库进行了一次修改, 添加了一个 1.py 的文件. 接下来我们就来查看版本库的些施工的过程. 可以看到在 Author 那已经有我的名字和 email 信息了.

$ git log

如果我们对1.py文件进行一次修改, 添加代码。然后我们就能在 status 中看到修改还没被提交的信息了:

$ git status

我们先把这次修改添加 (add) 到可被提交 (commit) 的状态, 然后再提交 (commit) 这次的修改:

$ git add 1.py
$ git commit -m "change"

查看 unstaged

如果想要查看这次还没 add (unstaged) 的修改部分 和上个已经 commit 的文件有何不同, 我们将使用 $ git diff:

$ git diff

查看 staged (–cached)

如果你已经 add 了这次修改, 文件变成了 “可提交状态” (staged), 我们可以在 diff 中添加参数 –cached 来查看修改:

$ git add .   # add 全部修改文件
$ git diff --cached

查看 staged & unstaged (HEAD)

还有种方法让我们可以查看 add 过 (staged) 和 没 add (unstaged) 的修改, 比如我们再修改一下 1.py 但不 add:

$ git diff HEAD

修改已 commit 的版本

有时候我们总会忘了什么, 比如已经提交了 commit 却发现在这个 commit 中忘了附上另一个文件. 接下来我们模拟这种情况. 上节内容中, 我们最后一个 commit 是 change 2, 我们将要添加另外一个文件, 将这个修改也 commit 进 change 2. 所以我们复制 1.py 这个文件, 改名为 2.py. 并把 2.py 变成 staged, 然后使用 –amend 将这次改变合并到之前的 change 2 中.

$ git add 2.py
$ git commit --amend --no-edit # "--no-edit": 不编辑, 直接合并到上一个 commit $ git log --oneline # "--oneline": 每个 commit 内容显示在一行

reset 回到 add 之前

有时我们添加 add 了修改, 但是又后悔, 并想补充一些内容再 add. 这时, 我们有一种方式可以回到 add 之前. 先自己改一下啊1.py文件,先add在返回到add之前

$ git add 1.py
$ git status -s # "-s": status 的缩写模式
# 输出
M 1.py # staged -----------------------
$ git reset 1.py
# 输出
Unstaged changes after reset:
M 1.py -----------------------
$ git status -s
# 输出
 M 1.py # unstaged

reset 回到 commit 之前

每个 commit 都有自己的 id 数字号, HEAD 是一个指针, 指引当前的状态是在哪个 commit. 最近的一次 commit 在最右边, 我们如果要回到过去, 就是让 HEAD 回到过去并 reset 此时的 HEAD 到过去的位置.

git reset --hard HEAD #回到一开始修改的位置
$ git log --oneline
5f42466 (HEAD -> master) change 2
2a17846 change 1
13be9a7 create 1.py

要回到2a17846:

$ git reset --hard HEAD^ #方法1
$ git reset --hard 2a17846 #方法2

查看现在的log

$ git log --oneline
2a17846 (HEAD -> master) change 1
13be9a7 create 1.py

change 2 消失了。找回change 2:

$ git reflog
2a17846 (HEAD -> master) HEAD@{0}: reset: moving to 2a17846
2a17846 (HEAD -> master) HEAD@{1}: reset: moving to HEAD^
5f42466 HEAD@{2}: reset: moving to HEAD
5f42466 HEAD@{3}: commit (amend): change 2
793dedb HEAD@{4}: commit: change 2
2a17846 (HEAD -> master) HEAD@{5}: commit: change 1
13be9a7 HEAD@{6}: commit (initial): create 1.py

Administrator@WQ-20120726FTTU MINGW64 ~/desktop/gitTut (master)
$ git reset --hard 793dedb
HEAD is now at 793dedb change 2

Administrator@WQ-20120726FTTU MINGW64 ~/desktop/gitTut (master)
$ git log --oneline
793dedb (HEAD -> master) change 2
2a17846 change 1
13be9a7 create 1.py

改写文件 checkout

仅仅要对 1.py 进行回到过去操作, 回到 c6762a1 change 1 这一个 commit. 使用 checkout + id c6762a1 + – + 文件目录 1.py, 我们就能将 1.py 的指针 HEAD 放在这个时刻 c6762a1:

$ git log --oneline
904e1ba (HEAD -> master) change 2
c6762a1 change 1
13be9a7 create 1.py

Administrator@WQ-20120726FTTU MINGW64 ~/desktop/gitTut (master)
$ git checkout c6762a1 -- 1.py

在 1.py 加上一行内容 # I went back to change 1 然后 add 并 commit 1.py:

$ git add 1.py

Administrator@WQ-20120726FTTU MINGW64 ~/desktop/gitTut (master)
$ git commit -m "back to change 1 and add comment for 1.py"
[master 7d830a0] back to change 1 and add comment for 1.py
 1 file changed, 2 insertions(+), 3 deletions(-)

Administrator@WQ-20120726FTTU MINGW64 ~/desktop/gitTut (master)
$ git log --oneline
7d830a0 (HEAD -> master) back to change 1 and add comment for 1.py
904e1ba change 2
c6762a1 change 1
13be9a7 create 1.py

分支:使用 checkout 创建 dev 分支

$ git branch dev

Administrator@WQ-20120726FTTU MINGW64 ~/desktop/gitTut (master)
$ git branch
  输出
  dev

当我们想把 HEAD 切换去 dev 分支的时候, 我们可以用到上次说的 checkout:

$ git checkout dev

 输出
Switched to branch 'dev' --------------------------
$ git branch

输出
* dev       # 这时 HEAD 已经被切换至 dev 分支
 master
 ```
##在 dev 分支中修改
使用 checkout -b + 分支名, 就能直接创建和切换到新建的分支:

g i t c h e c k o u t b d e v git branch

## 将 dev 的修改推送到 master
dev 分支中的 1.py 和 2.py 和 master 中的文件是一模一样的. 因为当前的指针 HEAD 在 dev 分支上, 所以现在对文件夹中的文件进行修改将不会影响到 master 分支.

我们在 1.py 上加入这一行 # I was changed in dev branch, 然后再 commit:

$ git commit -am “change 3 in dev”

好了, 我们的开发板 dev 已经更新好了, 我们要将 dev 中的修改推送到 master 中, 大家就能使用到正式版中的新功能了.

首先我们要切换到 master, 再将 dev 推送过来.

$ git checkout master # 切换至 master 才能把其他分支合并过来

git merge dev         # 将 dev merge 到 master 中 <merror> <mtext> git merge dev         # 将 dev merge 到 master 中 </mtext> </merror> git log –oneline –graph

要注意的是, 如果直接 git merge dev, git 会采用默认的 Fast forward 格式进行 merge, 这样 merge 的这次操作不会有 commit 信息. log 中也不会有分支的图案. 我们可以采取 --no-ff 这种方式保留 mergecommit 信息. 

git merge –no-ff -m “keep merge info” dev         # 保留 merge 信息 <merror> <mtext> git merge –no-ff -m “keep merge info” dev         # 保留 merge 信息 </mtext> </merror> git log –oneline –graph
“`