Git 的使用

1、 安装git
2、创建版本仓库
3、添加文件到 git仓库
4、修改文件、版本回退、撤销修改、删除文件
5、工作区和暂存区
6、添加远程库
7、从远程库克隆
8、创建分支 合并分支
9、向github上传文件遇到的问题

1、安装git

输入 git 查看是否已经安装了git

$ git

安装 git

$ sudo apt-get install git
2、创建版本仓库 repository
  • 先创建一个目录,我创建的目录名字为 learngit
$ mkdir learngit
$ cd learngit
$ pwd                        //命令 pwd 是用于显示当前目录的
  • 通过 git init 命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in F:/gitlearn/.git/

这样一个空的仓库就创建好了,并且在当前目录生成了一个 .git 文件,如果目中没有显示这个文件,那就是默认隐藏了,可以输入命令 ls -ah 来查看。

3、添加文件到 git仓库
  • 首先在我们创建的目录中添加一个 readme.txt 文件,文件内容如下:
Git is a version control system.
Git is free software.
  • 使用命令 git add 告诉git将文件添加到仓库,实际上就是把文件添加到暂存区。
    添加多个文件使用命令git add -A
$ git add readme.txt
  • 使用命令 git commit 告诉git,把文件提交到仓库,实际上就是把暂存区的所有内容提交到当前分支。
$ git commit -m "write a readme file"

-m 输入的是本次提交的说明.

注意: git add 可以多次重复使用,添加多个文件。git commit -m 可以一次提交多个文件

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 file" 
4、修改文件

首先修改readme.txt 文件,修改内容如下:

Git is a distributed version control system.
Git is free software

运行命令git status 查看结果

$ git status
  On branch master
  Changes not staged for commit:      // 没有提交的修改
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   readme.txt       //修改 :readme.txt 

no changes added to commit (use "git add" and/or "git commit -a")

git status命令时刻可以让我们掌握仓库的状态,上面内容告诉我们,readme.txt 文件修改了,但还没有更改添加到提交。

使用命令git diff 查看我们修改了什么内容

diff --git a/readme.txt b/readme.txt
index d8036c1..ee2c1ea 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.        //修改前的
-Git is free software.
\ No newline at end of file
+Git is a distributed version control system.   //修改后的
+Git is free software
\ No newline at end of file

使用命令 git add ,git commit -m提交修改文件

$ git add readme.txt
$ git commit -m "add distributed'

提交后我们在看看仓库的状态

$ git status
On branch master
nothing to commit, working tree clean

上面内容显示没有要提交的修改,且工作目录是干净的。

5、版本回退

命令git log 可以显示从最近到最远的提交日志,这样就知道之前我们都修改了什么内容。

$ git log
commit 8be8aaec4ea8b32fc1f6e2be4651143687296e95 (HEAD -> master)
Author: zhao-bi-han <[email protected]>
Date:   Sat Jul 22 11:04:33 2017 +0800

    add distributed

commit 59097a95b13d0bfb290e5a03d62b9c5ae01d4a4f
Author: zhao-bi-han <[email protected]>
Date:   Sat Jul 22 10:30:35 2017 +0800

    write a readme file

如果嫌信息输出的太多,可以加上参数 --pretty=oneline

$ git log --pretty=oneline
8be8aaec4ea8b32fc1f6e2be4651143687296e95 (HEAD -> master) add distributed
59097a95b13d0bfb290e5a03d62b9c5ae01d4a4f write a readme file

commit 后面一堆数字 是 commit id 版本号,使用十六进制表示而不使用数字1,2,3...表示,是防止多人开发时发生冲突。
HEAD表示当前版本,也就是最新的提交的,上一个版本就是HEAD^,上上个版本就是HEAD^^,比如在往上100个版本就可以写成HEAD~100

现在我们退回上一个版本,使用命令 git reset --hard HEAD^

$ git reset --hard HEAD^
HEAD is now at 59097a9 write a readme file

查看readme.txt文件,内容已经是上一个版本的内容了。

$ cat readme.txt
Git is a version control system.
Git is free software.

当然我还可以在回到之前的版本,在这之前我们先看看仓库的状态

$ git log
commit 59097a95b13d0bfb290e5a03d62b9c5ae01d4a4f (HEAD -> master)
Author: zhao-bi-han <[email protected]>
Date:   Sat Jul 22 10:30:35 2017 +0800

    write a readme file

我们发现已经没有之前的那个版本了,要想回到之前的版本,只要上面的命令行窗口还没有被关掉,我们就可以查找我们写过的命令,然后找到我们要回去的那个版本的 commit id

$ git reset --hard 8be8aaec4ea8b32
HEAD is now at 8be8aae add distributed

commit id版本号没必要写全,写上前几位就可以啦,git会自动去找。现在我们再来查看readme.txt文件

$ cat readme.txt
Git is a distributed version control system.
Git is free software

如果我们把命令行窗口关闭了,怎么回到之前的版本呢?Git有一条命令git reflog 用来记录你的每一次命令。

$ git reflog
8be8aae (HEAD -> master) HEAD@{0}: reset: moving to 8be8aaec4ea8b32
59097a9 HEAD@{1}: reset: moving to HEAD^
8be8aae (HEAD -> master) HEAD@{2}: commit: add distributed
59097a9 HEAD@{3}: commit (initial): write a readme file

这样我们就可以找到commit id了。

6、工作区和暂存区
  • 工作区
    是你在电脑里能看到的目录,比如我的gitlearn文件夹就是一个工作区。
  • 暂存区
    Git 的使用_第1张图片
    N4GN.png

    stage就是暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
    使用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
    执行命令git add后暂存区状态变化
    Git 的使用_第2张图片
    XFNWSKO.png

    执行命令git commit后暂存区状态变化
    Git 的使用_第3张图片
    07E58.png
7、撤销修改
  • 撤销工作区的修改
    比如我们修改了readme.txt文件,向该文件添加了一行,内容如下:
$ cat readme.txt
Git is a distributed version control system.
Git is free software
Add a row

问题来了,在把他添加到暂存区之前,我们又想把我们添加的一行去掉,我们可以执行命令git checkout -- file,该命令可以丢弃工作区的修改,有两种情况:第一种文件修改后还没有放到暂存区,撤销修改就会回到和版本库一模一样。第二种文件修改后放到了暂存区,然后文件又做了修改,在,撤销修改就回到添加到暂存区后的状态。

$ git checkout -- readme.txt

查看此时的readme.txt文件内容,回到了我们修改之前。

$ cat readme.txt
Git is a distributed version control system.
Git is free software
  • 撤销暂存区的修改
    撤销之前我们先查看一下仓库的状态
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        modified:   readme.txt

用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。

$ git reset HEAD readme.txt
Unstaged changes after reset:
M       readme.txt

在查看仓库状态,发现暂存区是干净的,工作区有修改。

$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   readme.txt
no changes added to commit (use "git add" and/or "git commit -a")

我们接着可以丢弃工作区的修改

$ git checkout -- readme.txt
$ git status
On branch master
nothing to commit, working tree clean
8、删除文件

我们现在目录中添加一个test.txt文件,并添加提交到git仓库

$ touch test.txt
$ git add test.txt
$ git commit -m "add a file"
[master 73a88f8] add a file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt

从版本库中删除文件。使用命令git rm file,并且git commit

$ git rm test.txt
rm 'test.txt'
$ git commit -m "delete a file"
[master e62a181] delete a file
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test.txt

如果我们使用命令rm file将文件错误删除想恢复,我们就使用命令git checkout -- file

$ git checkout -- test.txt
$ ls
readme.txt  test.txt

删除文件夹 使用命令git rm folder -r -f

9、添加远程库
  • 先在github上创建一个仓库learngit
  • 我们根据GitHub的提示,在本地的gitlearn仓库下运行命令,origin是远程库的名字,git的默认叫法。
$ git remote add origin https://github.com/zhao-bi-han/learngit.git
  • 把本地库的所有内容推送到远程库上
$ git push -u origin master
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (11/11), 965 bytes | 0 bytes/s, done.
Total 11 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To https://github.com/zhao-bi-han/learngit.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来。

  • 之后只要本地做了提交就可以通过以下命令,把本地master分支的最新修改推送至GitHub。
git push origin master

当我们想删除github的上文件时,执行以下命令:

$ git rm new -r -f                  //这里删除的是new文件夹
$ git commit -m "deletet new"
[master 2beb2e0] deletet new
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 new/index.txt
$ git push origin master                   //提交分支
10、从远程库克隆
  • 先在github中创建一个仓库git,并添加readme.md文件
Git 的使用_第4张图片
图片.png
  • 用命令git clone克隆一个本地库
$ git clone https://github.com/zhao-bi-han/git.git
Cloning into 'git'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.

切换到git目录,查看git下的文件会有一个readme.md文件

$ cd git
$ ls
README.md
11、创建分支 合并分支

每次提交master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

Git 的使用_第5张图片
主分支.png

当我们创建新的分支,例如 dev时,Git新建了一个指针叫 dev,指向 master相同的提交,再把 HEAD指向 dev,就表示当前分支在 dev上。
Git 的使用_第6张图片
分支.png

从现在开始,对工作区的修改和提交就是针对 dev分支了,比如新提交一次后, dev指针往前移动一步,而master指针不变。
Git 的使用_第7张图片
分支提交.png

假如我们在 dev上的工作完成了,就可以把 dev合并到 master上。
Git 的使用_第8张图片
合并分支.png

看看命令是如何实现的,首先创建一个分支 dev,并切换到 dev分支。

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev

git branch命令查看分支,*表示当前分支

$ git branch
*dev
  master

接下来,我们修改一下readme.txt文件,添加一行。

$ cat readme.txt
Git is a distributed version control system.
Git is free software
Add a row

然后提交

$ git add readme.txt
$ git commit -m "add"
[dev ce65b6f] add
 1 file changed, 2 insertions(+), 1 deletion(-)

现在,dev分支的工作完成,我们就可以切换回master分支。

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

现在,我们把dev分支的工作成果合并到master分支上。

$ git merge dev
Updating f69afe5..ce65b6f
Fast-forward
 readme.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

删除dev分支

$ git branch -d dev
Deleted branch dev (was ce65b6f).

查看分支

$ git branch
*master
12、向github上传文件遇到的问题

上传文件遇到以下问题

Git 的使用_第9张图片
问题.png

问题的原因:github上的文件跟本地文件不同步
问题解决:通过如下命令进行代码合并 git pull --rebase origin master,再上传文件执行命令 git push origin master。

你可能感兴趣的:(Git 的使用)