git:基于C语言开发的分布式版本控制系统
-
安装git
yum install -y git
git操作
-
创建版本库
版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
$ mkdir project $ cd project/ $ ls $ git init Initialized empty Git repository in F:/GitRepository/project/.git/ $ ls -a ./ ../ .git/
-
提交文件
工作区:就是你在电脑上看到的目录,比如目录下里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。
版本库:工作区有一个隐藏目录
.git
,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支
master
,以及指向master
的一个指针叫HEAD
。把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。所以,
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。# 因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识 # git config --global user.email "you@example.com" # git config --global user.name "Your Name" $ git config --global user.name "zzy" $ git config --global user.email "2284156175@qq.com" # git add 添加至缓存区 $ git add test.txt # git status 查看是否有文件未提交 $ git status On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: test.txt # git commit 把文件提交到仓库 ## -m 参数:提交的注释 ## 1 file changed:1个文件被改动(我们新添加的readme.txt文件); ## 4 insertions:插入了两行内容(readme.txt有两行内容)。 $ git commit -m "test" [master (root-commit) d677b5b] test 1 file changed, 4 insertions(+) create mode 100644 test.txt
第一次修改 ->
git add
-> 第二次修改 ->git commit
Git管理的是修改,当你用
git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。验证:
# 当前没有需要提交的修改 $ git status On branch master nothing to commit, working tree clean $ cat test.txt 111111 222222 333333 444444 # 修改文件 $ cat test.txt 111111 222222 333333 444444 555555 # 提交至缓存区 $ git add test.txt $ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: test.txt # 第二次修改文件 $ cat test.txt 111111 222222 # commit提交 $ git commit -m "modiffied 7" [master 1bf4353] modiffied 7 1 file changed, 1 insertion(+) # 查看状态却发现还有未提交的修改 $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a") # 虽然工作区看到的文件是第二次修改的样子,但是diff仍能看到文件的改动 $ git diff test.txt diff --git a/test.txt b/test.txt index 78e88e4..06ec666 100644 --- a/test.txt +++ b/test.txt @@ -1,5 +1,2 @@ 111111 222222 -333333 -444444 -555555 \ No newline at end of file # 退回至刚刚commit后的版本,不难发现,commit只提交了第一次git add至缓存区的内容,第二次修改并未提交 $ git reset --hard HEAD HEAD is now at 1bf4353 modiffied 7 $ cat test.txt 111111 222222 333333 444444 555555
-
跟踪文件修改信息
# 修改测试文件 # 查看状态 $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a") # 提交 $ git add test.txt # 查看期间文件修改了什么内容 $ git diff test.txt diff --git a/test.txt b/test.txt index 07ece74..3801997 100644 --- a/test.txt +++ b/test.txt @@ -4,4 +4,5 @@ 444444 55555 666666 -撒大大 \ No newline at end of file +撒大大 +阿斯顿 \ No newline at end of file $ git commit -m "modefied 1" [master 120934a] modefied 1 1 file changed, 4 insertions(+), 1 deletion(-) # 查看日志 ## git log命令显示从最近到最远的显示日志 $ git log commit 120934a3c175421a09c499590124636c671a9f62 (HEAD -> master) Author: zhaoziyan <2284156175@qq.com> Date: Mon May 31 17:38:43 2021 +0800 modefied 1 commit d677b5bbd489bdcdc144773a045ae3123926c95b Author: zhaoziyan <2284156175@qq.com> Date: Mon May 31 17:23:00 2021 +0800 test ## 如果嫌上面显示的信息太多的话,我们可以使用命令 git log –pretty=oneline $ git log --pretty=oneline 120934a3c175421a09c499590124636c671a9f62 (HEAD -> master) modefied 1 d677b5bbd489bdcdc144773a045ae3123926c95b test
-
版本回退
- 通过git内部变量回退
$ git log commit b8073973eb7ed3f0a3d94fc552cf236da7530351 (HEAD -> master) Author: zhaoziyan <2284156175@qq.com> Date: Mon May 31 17:45:58 2021 +0800 modiffied 3 commit 184a6754b427497f50cd5e0f3a01baa5767fa06d Author: zhaoziyan <2284156175@qq.com> Date: Mon May 31 17:45:21 2021 +0800 modiffied 2 commit 120934a3c175421a09c499590124636c671a9f62 Author: zhaoziyan <2284156175@qq.com> Date: Mon May 31 17:38:43 2021 +0800 modefied 1 commit d677b5bbd489bdcdc144773a045ae3123926c95b Author: zhaoziyan <2284156175@qq.com> Date: Mon May 31 17:23:00 2021 +0800 test # 回退上一版本 ## HEAD 当前状态 ## HEAD^ 上一次状态 ## HEAD^^ 上上次状态 ## HEAD~10 $ git reset --hard HEAD^ HEAD is now at 184a675 modiffied 2 $ git log --pretty=oneline 184a6754b427497f50cd5e0f3a01baa5767fa06d (HEAD -> master) modiffied 2 120934a3c175421a09c499590124636c671a9f62 modefied 1 d677b5bbd489bdcdc144773a045ae3123926c95b test
2.通过git记录的每次修改的ID实现版本回退
# 查看操作ID $ git reflog 184a675 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^ b807397 HEAD@{1}: commit: modiffied 3 184a675 (HEAD -> master) HEAD@{2}: commit: modiffied 2 120934a HEAD@{3}: commit: modefied 1 d677b5b HEAD@{4}: commit (initial): test $ git reflog test.txt 184a675 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^ b807397 HEAD@{1}: commit: modiffied 3 184a675 (HEAD -> master) HEAD@{2}: commit: modiffied 2 120934a HEAD@{3}: commit: modefied 1 d677b5b HEAD@{4}: commit (initial): test # 版本控制回退 $ git reset --hard b807397 HEAD is now at b807397 modiffied 3
-
撤销修改
1.撤销未提交的修改
# git checkout -- file 可以丢弃工作区的修改,将文件在工作区做的修改全部撤销,如果没有 -- 的话,那么命令变成创建分支了 ## 文件自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。 ## 另外一种是文件已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。 $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: test.txt no changes added to commit (use "git add" and/or "git commit -a") $ git checkout -- test.txt $ git status On branch master nothing to commit, working tree clean
2.撤销已经提交到暂存区的修改
git reset HEAD
是将暂存区和HEAD的提交保持一致,拉取最近一次提交到版本库的文件到暂存区,改操作不影响工作区简单的来说 就是可以帮我们从版本库中 拉取文件到 暂存区 当我们把工作区的某个文件弄乱了 我们就可以使用该命令 把版本库中的那个文件拉到暂存区 然后在拉回工作区
git reset --hard HEAD
是将工作区、暂存取和HEAD保持一致$ git diff test.txt diff --git a/test.txt b/test.txt index 07ece74..e69de29 100644 --- a/test.txt +++ b/test.txt @@ -1,7 +0,0 @@ -111111 -222222 -333333 -444444 -55555 -666666 -撒大大 \ No newline at end of file $ git add test.txt $ git diff test.txt diff --git a/test.txt b/test.txt index e69de29..d39cda9 100644 --- a/test.txt +++ b/test.txt @@ -0,0 +1,2 @@ +aaa +bbb \ No newline at end of file $ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: test.txt Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: test.txt $ git reset HEAD test.txt Unstaged changes after reset: M test.txt $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: test.txt $ git checkout -- test.txt # 相当于git reset HEAD之后紧接着又checkout $ git reset --hard HEAD HEAD is now at 1d91802 modiffied 5
3.撤销已经提交到工作区的修改
通过git记录的每次修改的ID实现版本回退
-
删除文件
# 删除文件 $ git rm test.txt rm 'test.txt' $ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) deleted: test.txt # 恢复文件 $ git reset HEAD test.txt Unstaged changes after reset: D test.txt $ git checkout -- test.txt # 彻底从版本库中删除 $ git rm test.txt rm 'test.txt' $ git commit -m "delete 1" [master c46c5cc] delete 1 1 file changed, 7 deletions(-) delete mode 100644 test.txt # 恢复文件 $ git reset --hard HEAD^ HEAD is now at 1d91802 modiffied 5
git分支
-
创建与合并分支
在版本回填退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
# 创建分支 $ git branch dev # 查看分支 $ git branch dev * master # 切换分支 $ git checkout dev Switched to branch 'dev' $ git branch * dev master # 删除分支 $ git branch -d test Deleted branch test (was 1bf4353). # 合并分支 ## 将指定的分支合并到当前分支 $ git merge master Already up to date.
-
分支管理策略
通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 –no-ff来禁用”Fast forward”模式。