您的位置:首页 > 其它

Git使用常见命令的理解和记录

2016-07-07 15:30 429 查看
git使用了很久,可是用到的功能基本上也就add commit push 这几个,趁着今天有点时间,把git的东西整理一下。

BTW,找了份git教程,需要看的直接去廖雪峰的网站看吧,附上链接:http://www.liaoxuefeng.com,我这里只是记下自己需要用的东西。

git是一个分布式版本控制系统,免去了不断自己更新版本号的麻烦,同时也帮助coder记下修改的地方。不过git的优秀主要还是由于它可以不需要中央服务器,本机即可当成一个代码库。互相之间推送本地的更新内容。其次就是由于它优秀的分支管理的实现,非常好用。

一、新建代码仓库Repositoy:git init

admin@admin-PC MINGW64 /d/Git/Work (master)
$ cd test

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git init
Initialized empty Git repository in D:/Git/Work/test/.git/

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ ls -ah
./  ../  .git/


首先进入相应的文件夹,然后使用git init命令即可完成仓库的构建。然后用ls查看当前目录下的文件,可以发现已经多了一个.git的文件夹,这个.git目录就是用来跟踪和管理版本库的

二、将文件添加到仓库暂存区:git add

在当前目录下新建一个文本 test.txt, 然后将这个文本添加到仓库暂存区,使用git add 来实现。git代码库分为暂存区和工作区。当前的工作目录称之为工作区,



git版本回退和版本控制都是在版本控制目录Master上进行的,而个人用户的本地修改是在工作区,可以先放到暂存区,当个人修改全部完了之后,再提交到版本库,方便和同事的协同工作,避免不完整的代码片段。

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git add test.txt

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git add .

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git status
On branch master

Initial commit

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file:   test.txt
如上,可以使用git add test.txt,也可以使用git add . 不同的是前者只添加了一个文件,后者是添加了当前目录中的所有文件

将文件添加到暂存区之后,使用git status查看暂存区的当前改动,可以看到,git给了提示:new了一个新文件,text.txt

如果想要查看当前工作区中的修改和上次的提交有什么不同,可以使用git diff查看详细的修改内容

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git diff head
diff --git a/test.txt b/test.txt
index d2c6b47..bb3b471 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
-new test.txt  --version 1.0
\ No newline at end of file
+new test.txt  --version 1.0
+modify 1'st   --version 2.0
这里使用了git diff head 判断当前的暂存区中的文档和工作区中head指向的文本之间的不同,可以看出,git给出了回应:工作区中的head指针指向的文本与当前暂存区中的文本相比:No newline at end of file,文件末尾缺少一行,并且展示了两个文件的详细内容

三、将文件从暂存区提交到工作区:git commit

需要注意的是,文件的提交过程必须是首先从本地工作区提交到暂存区,然后从暂存区提交到版本库控制目录。如果暂存区没有文件,那么提交到版本库目录的内容也是空的。

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git commit -m "v1.0 new file"
[master (root-commit) 714bd8a] v1.0 new file
1 file changed, 1 insertion(+)
create mode 100644 test.txt
使用git commit -m “message”,其中-m后面的参数是当前提交的说明,为了方便协同工作的时候,同事理解你的提交,这个message的内容最好是要写的。

从上面的反馈可以看出,做了一次提交,这次提交的提示信息是v1.0 new file,然后git告诉我,一个文件改变了,工作区中创建了test.txt

add的时候是向git暂存区添加文件,而commit则是从暂存区将文件提交给仓库管理目录

至此,代码仓库的新建和提交都完成了,下面写一下版本回退,毕竟提交了之后,万一想要回到之前的版本,也是可以的。

四、查看历史操作记录:git log

想要恢复到历史版本,我们首先应该知道历史都做了那些操作,使用git log来完成这个需求

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git log
commit f2c81d903aeaf50b74db3ec0bf641dce8692373b
Author: blyang <clear_d@163.com>
Date:   Thu Jul 7 14:11:00 2016 +0800

v2,0 add one line

commit 714bd8a98127db6ca78dde70ea0922560ca8712a
Author: blyang <clear_d@163.com>
Date:   Thu Jul 7 13:48:52 2016 +0800

v1.0 new file

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$
从上面的反馈可以看出,历史进行了两次提交到工作区的操作。注意到,git log只能记录提交到工作区的操作,提交到暂存区的操作是不会被记录的。而现在,工作区中的head指针是指向第二次修改后的文本的,也就是记录上显示的v2.0的文件。commit后面的那一长串十六进制的数字,表示的是文件的版本号

五、版本回退:git reset

通过git reset可以改变工作区中的head指针,让它指向任意一个我们想要的文件

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ cat test.txt
new test.txt  --version 1.0
modify 1'st   --version 2.0

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git reset --hard head^
HEAD is now at 714bd8a v1.0 new file

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ cat test.txt
new test.txt  --version 1.0
如上所示,刚开始用cat获取一下文件的内容,显示的是版本2的内容,然后用git reset --hard head^来重置head指针使之指向上一个提交的文件,然后再用cat获取一次文件内容,发现文件内容已经改变了,也就是文件版本已经回到了之前的版本

除了使用head^表示上一个提交的版本之外,还可以直接使用版本号去定位head指针。

当前的head指针指向的是版本一,然后现在我们又想要回到版本二去,如下,使用commit reset --hard commidID

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git reflog
714bd8a HEAD@{0}: reset: moving to head^
f2c81d9 HEAD@{1}: commit: v2,0 add one line
714bd8a HEAD@{2}: commit (initial): v1.0 new file

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ git reset --hard f2c8
HEAD is now at f2c81d9 v2,0 add one line

admin@admin-PC MINGW64 /d/Git/Work/test (master)
$ cat test.txt
new test.txt  --version 1.0
modify 1'st   --version 2.0
我们首先用git reflog找出历史操作的记录,然后找到版本二对应的版本号,使用git reset --hard commitID恢复到我们想要的文件。这里显示的版本号只是一个缩写,也不用写全,git会自己去匹配查找。

然后再用cat查看文件,发现又回到了我们想要的版本2文件。

六、git checkout用暂存区覆盖本地工作区

对git checkout理解有点模糊,这里先记下几个命令吧

$ git checkout -- test.txt
用暂存区的文件来覆盖工作区中的文件,相当于取消自上次add file以来所有的本地操作

注意到,如果是某个文件commit了,那么它一定能在版本目录中找到,不用担心丢失。

我个人的理解是:

用git reset将版本库中的文件覆盖暂存区

用git checkout将暂存区中的文件覆盖本地工作区

七、从版本库中删除文件:git rm

删除文件 git rm,注意这里也只是当前分支中删除了文件,如果想要恢复,只要找到之前的版本,reset一下就行了

admin@admin-PC MINGW64 /d/Git/Work/test ((a5f0f87...))
$ rm test.txt

admin@admin-PC MINGW64 /d/Git/Work/test ((a5f0f87...))
$ git diff
diff --git a/test.txt b/test.txt
deleted file mode 100644
index dc762e2..0000000
--- a/test.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-new test.txt  --version 1.0
-modify 1'st   --version 2.0
-modify 2'st   --version 3.0

admin@admin-PC MINGW64 /d/Git/Work/test ((a5f0f87...))
$ git commit -m "delete"
HEAD detached at head
Changes not staged for commit:
deleted:    test.txt

no changes added to commit

admin@admin-PC MINGW64 /d/Git/Work/test ((a5f0f87...))
$ git add .

admin@admin-PC MINGW64 /d/Git/Work/test ((a5f0f87...))
$ git commit -m "delete head"
[detached HEAD d22a561] delete head
1 file changed, 3 deletions(-)
delete mode 100644 test.txt
如上,将文件删除掉,在提交之后,此时新的版本库里面已经没有这个文件了

我们打印一下仓库目录的日志:

admin@admin-PC MINGW64 /d/Git/Work/test ((d22a561...))
$ git log
commit d22a5612e2e92b54ff3f1df70cd7a100905abea2
Author: blyang <clear_d@163.com>
Date:   Thu Jul 7 15:23:53 2016 +0800

delete head

commit a5f0f8755bd1f5cb5b19a4322f93ce042693be0d
Author: blyang <clear_d@163.com>
Date:   Thu Jul 7 14:44:08 2016 +0800

v3.0 add one line more

commit f2c81d903aeaf50b74db3ec0bf641dce8692373b
Author: blyang <clear_d@163.com>
Date:   Thu Jul 7 14:11:00 2016 +0800

v2,0 add one line

commit 714bd8a98127db6ca78dde70ea0922560ca8712a
Author: blyang <clear_d@163.com>
Date:   Thu Jul 7 13:48:52 2016 +0800

v1.0 new file
如上,可以看到最新的目录已经删除了文件。

当想要重新恢复的时候,只要同步版本库和暂存区,然后再同步暂存区和工作区就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: