Loading

git的基本操作

git的基本操作

1. 创建版本库

git创建版本库要先在一个选择好的工作目录下输入命令git init,(如果是第一次使用git,还需要设置用户名和邮箱命令是 git config --global user.email "you@example.com"git config --global user.name "Your Name")该命令会在当前目录下创建一个.git的文件夹,这是个隐藏文件,建议不要去碰这个文件夹。

2. 生成新版本

git生成一个文件的新版本有两个步骤,第一个是git add <fliename>,将文件存入缓冲区(暂存区),第二个步骤是git commit -m "备注"将文件提交至分支,生成新版本。

3. 获取修改内容

git管理下文件被修改后会有记录(被add过在暂存区的文件才会有)

我们随时随刻可以用git status来查看git的状态

例如新建一个文件gittext.txt,然后生成新版本

xyc@click-machine:~/work/notegit$ touch gits.txt
xyc@click-machine:~/work/notegit$ vi gits.txt
xyc@click-machine:~/work/notegit$ cat gits.txt
This is a File
xyc@click-machine:~/work/notegit$ git status
位于分支 master

尚无提交

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

	gits.txt

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)

建好文件后保存然后查看git状态,发现提示“提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)”这说明要获取修改内容的前提是这个文件被add过,所以下面add该文件。

xyc@click-machine:~/work/notegit$ git add gits.txt

此时虽然此时没有提示,但是这也说明他添加从成功了因为 No news is the best news.

如果我们这时修改这个文件为

xyc@click-machine:~/work/notegit$ cat gits.txt
This is a Fil
a new line

然后再查看git状态

xyc@click-machine:~/work/notegit$ git status
位于分支 master

尚无提交

要提交的变更:
  (使用 "git rm --cached <文件>..." 以取消暂存)

	新文件:   gits.txt

尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     gits.txt

已经检测到变更,但是提示我的变更并未放入暂存(没有add)

然后我们可以用 git diff <filename>来获取变更内容

xyc@click-machine:~/work/notegit$ git diff gits.txt
diff --git a/gits.txt b/gits.txt
index 2c3b38e..917f566 100644
--- a/gits.txt
+++ b/gits.txt
@@ -1 +1,2 @@
-This is a File
+This is a Fil
+a new line 

上面详细地给出了变更内容

4. 提交版本&暂存区&工作区

上面多次提到暂存区,那么什么是暂存区呢,暂存区存在于.git文件里面,工作区就是我们选择的用git init 的根目录,就拿刚刚的例子,我修改了那个文件,那个文件修改前的内容存在暂存区,修改后的存在工作区,提交版本就是提交暂存区的内容到分支。

提交版本的命令为git commit -m "备注",假如我现在提交版本的话,就是旧版本被提交,而不是修改后的版本。

我们可以通过git log命令来获取提交的版本,还可以通过git reset  --hard  版本号的一部分来选择版本,例如我现在提交版本

xyc@click-machine:~/work/notegit$ git commit -m "commit old version"
[master (根提交) da220bd] commit old version
 1 file changed, 1 insertion(+)
 create mode 100644 gits.txt
xyc@click-machine:~/work/notegit$ git log
commit da220bd118e908ae848d9e23b77dad833b1235e7 (HEAD -> master)
Author: X_X <750133671@qq.com>
Date:   Fri Apr 2 19:58:24 2021 +0800

    commit old version
xyc@click-machine:~/work/notegit$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     gits.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

可以发现工作区的文件还在提示没有提交到暂存区,此时我们将工作区修改后的内容add到暂存区再查看git状态。

xyc@click-machine:~/work/notegit$ git add gits.txt
xyc@click-machine:~/work/notegit$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	修改:     gits.txt

xyc@click-machine:~/work/notegit$ 

现在的状态又在提示已经到了暂存区,但是还没有提交,正准备提交。

现在我们提交它。

xyc@click-machine:~/work/notegit$ git commit -m "The Second Commit"
xyc@click-machine:~/work/notegit$ git log
commit 50d8af4d3609b7ab28d5c7941a2862b7bfdb3ab6 (HEAD -> master)
Author: X_X <750133671@qq.com>
Date:   Fri Apr 2 20:08:54 2021 +0800

    The Second Commit

commit da220bd118e908ae848d9e23b77dad833b1235e7
Author: X_X <750133671@qq.com>
Date:   Fri Apr 2 19:58:24 2021 +0800

    commit old version

现在我们成功把新版本提交到了分支上。

这时我们再看git的状态。

xyc@click-machine:~/work/notegit$ git status
位于分支 master
无文件要提交,干净的工作区

5. 版本回退,找到以前的版本

命令git reset  --hard 版本号的一部分

嫌麻烦也可以用git reset --hard HEAD^

其中^号一个就是回退一个版本,^^就是回退两个版本以此类推

当我们提交了多个版本,有想要回退或者前进到某一个版本时我们可以用上述命令

xyc@click-machine:~/work/notegit$ git log
commit 50d8af4d3609b7ab28d5c7941a2862b7bfdb3ab6 (HEAD -> master)
Author: X_X <750133671@qq.com>
Date:   Fri Apr 2 20:08:54 2021 +0800

    The Second Commit

commit da220bd118e908ae848d9e23b77dad833b1235e7
Author: X_X <750133671@qq.com>
Date:   Fri Apr 2 19:58:24 2021 +0800

    commit old version

上面commit后面跟的奇奇怪怪的就是commit ID也就是版本号。版本号后面跟了一个括号,那个就是 表示当前的版本。

分支版本回退以后工作区的文件也会自动版本回退。

那么又出现了一个新的问题,我今天晚上把版本回退到以前了,然后我把电脑关了,第二天觉得不应该退,还是不退好,但是我又不知道版本号了怎么办。

在git中给我们提供了一个指令git reflog用来查询每一次的命令。

xyc@xzalinux:~/work/notegit$ git log
commit 50d8af4d3609b7ab28d5c7941a2862b7bfdb3ab6 (HEAD -> master)
Author: X_X <750133671@qq.com>
Date:   Fri Apr 2 20:08:54 2021 +0800

    The Second Commit

commit da220bd118e908ae848d9e23b77dad833b1235e7
Author: X_X <750133671@qq.com>
Date:   Fri Apr 2 19:58:24 2021 +0800

    commit old version
xyc@xzalinux:~/work/notegit$ git reset --hard da22
HEAD 现在位于 da220bd commit old version
xyc@xzalinux:~/work/notegit$ git log
commit da220bd118e908ae848d9e23b77dad833b1235e7 (HEAD -> master)
Author: X_X <750133671@qq.com>
Date:   Fri Apr 2 19:58:24 2021 +0800

    commit old version
    
    
    
xyc@xzalinux:~/work/notegit$ git reflog
da220bd (HEAD -> master) HEAD@{0}: reset: moving to da22
50d8af4 HEAD@{1}: reset: moving to 50d8a
50d8af4 HEAD@{2}: commit: The Second Commit
da220bd (HEAD -> master) HEAD@{3}: commit (initial): commit old version
xyc@xzalinux:~/work/notegit$ 

可以看到版本更迭。

6. 撤销修改

每次当你修改了工作区文件,但是你还没有add到缓存区,你直接用git status命令查看git状态的时候,你仔细看看下面的提示。

xyc@xzalinux:~/work/notegit$ ls
gits.txt
xyc@xzalinux:~/work/notegit$ vi gits.txt
xyc@xzalinux:~/work/notegit$ cat gits.txt
This is a Fil
a new line
撤销修改
xyc@xzalinux:~/work/notegit$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     gits.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

可以看到(使用 "git checkout -- <文件>..." 丢弃工作区的改动)这一行,丢弃改动,相当于是手动撤回。

我在文档中加了一行写上了"撤销修改"四个字。

当我使用git checkout -- filename这个命令时,就会撤销工作区的改动。

xyc@xzalinux:~/work/notegit$ git checkout -- gits.txt
xyc@xzalinux:~/work/notegit$ git status
位于分支 master
无文件要提交,干净的工作区
xyc@xzalinux:~/work/notegit$ cat gits.txt
This is a Fil
a new line

还有一种就是你改错了并且已经add到了缓存区例如这样

xyc@xzalinux:~/work/notegit$ cat gits.txt
This is a Fil
a new line
撤销更改2
xyc@xzalinux:~/work/notegit$ git add gits.txt
xyc@xzalinux:~/work/notegit$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	修改:     gits.txt

我们看到他又给出了提示(使用 "git reset HEAD <文件>..." 以取消暂存)可以取消暂存,当我们用这个命令取消暂存之后再看git状态会是什么样子的呢?

xyc@xzalinux:~/work/notegit$ git reset HEAD gits.txt
重置后取消暂存的变更:
M	gits.txt


xyc@xzalinux:~/work/notegit$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     gits.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

    

就变得跟刚刚说的第一种情况一样了,就可以按照上面的方法继续撤回修改。

7. 关于删除文件

准备工作(新建一个待删文件然后提交):

xyc@xzalinux:~/work/notegit$ touch del.txt
xyc@xzalinux:~/work/notegit$ vi del.txt
xyc@xzalinux:~/work/notegit$ cat del.txt
This is a file ready to be delete

xyc@xzalinux:~/work/notegit$ git add del.txt
xyc@xzalinux:~/work/notegit$ git commit -m "delFile"
[master 967925c] delFile
 1 file changed, 2 insertions(+)
 create mode 100644 del.txt

现在我们删除它

xyc@xzalinux:~/work/notegit$ rm del.txt
xyc@xzalinux:~/work/notegit$ ls
gits.txt

现在它已经被删除了,然后我们用git status来查看git现阶段的状态。

xyc@xzalinux:~/work/notegit$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add/rm <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	删除:     del.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

有没有发现很熟悉,其实删除本身就是对文件的一种修改,此时我们可以放弃这种改动,也就是放弃删除这种改动,可以用到前面说到的git checkout --filename 来撤回修改,也可以保存这种修改到缓存区准备提交版本,就能用到git rm filename来从版本库删除这个文件,再commit提交这个文件。

xyc@xzalinux:~/work/notegit$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add/rm <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	删除:     del.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
xyc@xzalinux:~/work/notegit$ git rm del.txt
rm 'del.txt'
xyc@xzalinux:~/work/notegit$ git status
位于分支 master
要提交的变更:
  (使用 "git reset HEAD <文件>..." 以取消暂存)

	删除:     del.txt

xyc@xzalinux:~/work/notegit$ git commit -m "del del.txt"
[master 3c1d068] del del.txt
 1 file changed, 2 deletions(-)
 delete mode 100644 del.txt

关于删除后找回:

如果还没add到缓存区,也就是还没有用git rm filename命令,那就可以直接使用git checkout --filename 来撤回修改。

如果已经add到了缓存区,可以使用git reset HEAD filename来把修改从缓存区移走。

如果已经提交了,可以使用git reset --hard HEAD^来回退版本。

posted @ 2021-04-03 17:47  [X_O]  阅读(87)  评论(0编辑  收藏  举报