创建版本库 (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 + 分支名, 就能直接创建和切换到新建的分支:
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 中 git log –oneline –graph
要注意的是, 如果直接 git merge dev, git 会采用默认的 Fast forward 格式进行 merge, 这样 merge 的这次操作不会有 commit 信息. log 中也不会有分支的图案. 我们可以采取 --no-ff 这种方式保留 merge 的 commit 信息.
git merge –no-ff -m “keep merge info” dev # 保留 merge 信息 git log –oneline –graph
“`