美文网首页我爱编程
Git的基本操作

Git的基本操作

作者: Jackpon | 来源:发表于2018-04-14 19:53 被阅读0次
    • Git是什么?

    Git是目前世界上最先进的分布式版本控制系统(没有之一),简单点讲就是可以记录你对文件每一次的改动,而且还可以让同事协作编辑。

    • 在Linux上安装Git
      首先可以先在终端输入git,查看系统有没有安装:
    $ git
    The program 'git' is currently not installed. You can install it by typing:
    sudo apt-get install git
    

    查看版本:

    $ git --version
    git version 2.7.4
    
    • 创建远程仓库
      创建完账号后,可以开始创建仓库:
    这里写图片描述 这里写图片描述
    • SSH 公私钥的使用
      讲解如何使用 ssh-keygen 生成公私钥,在终端输入命令,然后建议一路按enter就可以(会把密钥文件放置再默认路径~/.ssh/
    $ ssh-keygen
    

    查看两个密钥文件,后缀为 .pub 的就是公钥文件,另一个没有后缀的就是私钥文件;

    • 关联公钥到 Github 账号下
      首先复制公钥文件中的内容,也就是 ssh-rsa 开头到 用户名@主机名 这段字符串(全部复制就对了);打开Setting ->SSH and GPG keys,选择new SSH key,填写title和以及将刚才的复制内容粘贴到key:

      这里写图片描述
    • 配置用户名与邮箱

    ### 如果想设置为全局生效,添加 --global 参数
    $ git config --global user.name "你的用户名"
    $ git config --global user.email "你的邮箱"
    
    • 克隆仓库到本地的个人PC

    首先到远程仓库中,点击 Clone or download 按钮,选择使用 Use SSH,然后点击复制链接按钮


    这里写图片描述
    #命令用法:git clone "你复制的仓库链接"
    $ git clone git@github.com:Jackpon/Test3.git
    正克隆到 'Test3'...
    remote: Counting objects: 3, done.
    remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
    接收对象中: 100% (3/3), 完成.
    检查连接... 完成。
    $ ls
    Test3
    

    clone完在你的当前目录下就有你克隆的文件(我的是Test3),接下来进入Test3,你就可以进行编辑操作了。

    • git的基本流程如下

    1、 创建或修改文件
    2、 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
    3、 使用git commit命令提交到本地代码库
    4、 使用git push命令将本地代码库同步到远端代码库

    • 读取文件
    jackpon@jackpon:~/MyGit_repository$ cd Test3
    jackpon@jackpon:~/MyGit_repository/Test3$ ls
    README.md
    jackpon@jackpon:~/MyGit_repository/Test3$ cat README.md 
    # Test3
    add a repository -Test3
    
    • 添加文件
    //$ git add filename
    jackpon@jackpon:~/MyGit_repository/Test3$ echo 'file1'>file1
    jackpon@jackpon:~/MyGit_repository/Test3$ git add file1 
    jackpon@jackpon:~/MyGit_repository/Test3$ ls
    file1  README.md
    
    • 删除文件
    jackpon@jackpon:~/MyGit_repository/Test3$ git rm README.md 
    rm 'README.md'
    
    
    • 撤销
      要把仓库里的改动撤销回克隆下来的状态(注意,如果改动之后执行了提交就无法再撤销,只能从远程仓库重新克隆一份到本地),可以使用 git reset 命令,具体步骤如下:
      比如我们要把刚才删除的 README.md 文件给还原回来,就可以在仓库目录下,敲入 git reset --hard HEAD 来回退
    jackpon@jackpon:~/MyGit_repository/Test3$ git reset --hard HEAD 
    HEAD 现在位于 953adc8 Initial commit
    jackpon@jackpon:~/MyGit_repository/Test3$ ls
    README.md
    jackpon@jackpon:~/MyGit_repository/Test3$ cat README.md 
    # Test3
    add a repository -Test3
    
    • 补充(版本回退):
      • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id;
      • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本;
      • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本.
    • 提交仓库的改动*

    在仓库的每一次改动操作之后,推送同步到远程仓库之前,都需要对这一次或这一批次的操作做提交,命令为 git commit,用法是 git commit -m "你的提交备注",只有做好提交动作,才可以开始推送改动到远程仓库同步

    jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'add file1'
    [master da2439b] add file1
     1 file changed, 1 insertion(+)
     create mode 100644 file1
    
    • 推送改动到远程仓库中

    当我们提交了仓库的改动后,就可以开始推送改动的内容到远程仓库了,可以使用 git push 命令来推送,用法是 git push [-u] origin <分支名>,分支名默认是 master 具体步骤如下

    第一次推送改动可以使用 -u 参数,使用之后会绑定你这一次的仓库分支名,这样的话下一次推送就不需要加上分支名了,如图

    jackpon@jackpon:~/MyGit_repository/Test3$ git push
    对象计数中: 3, 完成.
    Delta compression using up to 4 threads.
    压缩对象中: 100% (2/2), 完成.
    写入对象中: 100% (3/3), 274 bytes | 0 bytes/s, 完成.
    Total 3 (delta 0), reused 0 (delta 0)
    To git@github.com:Jackpon/Test3.git
       953adc8..da2439b  master -> master
    

    操作完后,在你的github上的Test3中就有file1。

    • 同步到本地仓库
    $  git pull
    

    <div class="divider"></div>

    • 分支与合并

    Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。

    1、 分支

    // 创建一个新的叫 Mybranch的分支:
     $ git branch Mybranch
     
    //查看现在处于哪个分支:
    $ git branch
      Mybranch
    * master
    

    master分支是Git系统默认创建的主分支。星号标识了你当工作在哪个分支下,输入git checkout 分支名 可以切换到其他分支:

    jackpon@jackpon:~/MyGit_repository/Test3$ git checkout Mybranch 
    切换到分支 'Mybranch'
    jackpon@jackpon:~/MyGit_repository/Test3$ ls
    file1  README.md
    

    我们来修改下Mybranch分支下的file1成‘修改-file1’,为待会的合并做准备

    jackpon@jackpon:~/MyGit_repository/Test3$ vim file1 
    jackpon@jackpon:~/MyGit_repository/Test3$ git status
    位于分支 Mybranch
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
        修改:     file1
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    jackpon@jackpon:~/MyGit_repository/Test3$ git add file1 
    jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'Mybranch:file1'
    [Mybranch e10ee96] Mybranch:file1
     1 file changed, 1 insertion(+), 1 deletion(-)
    

    2、 合并
    跳转回master并对file1修改成‘master:file1’

    jackpon@jackpon:~/MyGit_repository/Test3$ vim file1 
    jackpon@jackpon:~/MyGit_repository/Test3$ git checkout master 
    M   file1
    切换到分支 'master'
    您的分支与上游分支 'origin/master' 一致。
    
    jackpon@jackpon:~/MyGit_repository/Test3$ cat file1 
    file1
    jackpon@jackpon:~/MyGit_repository/Test3$ vim file1 
    jackpon@jackpon:~/MyGit_repository/Test3$ git add file1 
    jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'master:file1'
    [master b1730e4] master:file1
     1 file changed, 1 insertion(+), 1 deletion(-)
    

    这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?

    可以通过下面的git merge命令来合并Mybranch到主线分支master:

    # 切换到master分支
    $ git checkout master
    # 将Mybranch分支合并到master
    $ git merge  -m 'merge Mybranch branch' Mybranch
    
    这里写图片描述
    jackpon@jackpon:~/MyGit_repository/Test3$ cat file1 
    <<<<<<< HEAD
    master:file1
    =======
    修改-file1
    >>>>>>> Mybranch
    

    可以看到冲突的内容被加到file1中了,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file1和git commit命令来提交合并后的file1内容,这个过程是手动解决冲突的流程。

    jackpon@jackpon:~/MyGit_repository/Test3$ vim file1 
    jackpon@jackpon:~/MyGit_repository/Test3$ git add file1 
    jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m '合并file1'
    [master 67493f3] 合并file1
    jackpon@jackpon:~/MyGit_repository/Test3$ cat file1 
    master:file1
    修改-file1
    
    • 合并形象化命令:
    $ git log --graph --pretty=oneline
    *   67493f39d9383ed394e3fa95e5a30dee2e2c1416 合并file1
    |\  
    | * e10ee96d7ac0500702229347d94c9dc4ff34ef14 Mybranch:file1
    * | b1730e4c8e8832e6cdd47b4be66139086fb1b458 master:file1
    |/  
    * da2439b93eb8c7538ca037b4dab940d1a40a0452 add file1
    
    • 撤销一个合并

    如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:

    $ git reset --hard HEAD^
    # 查看file1的内容,已经恢复到合并前的master上的文件内容
    $ cat file1
    
    • 删除分支

    当我们完成合并后,不再需要Mybranch时,可以使用下面的命令删除:

    $ git branch -d Mybranch
    

    git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D

    • 比较分支
      我们先创建分支test,并改变编辑test中的文件,最后比较两个分支的不同处:
    $ echo "branch test">>file1
    $ echo "new file2">>file2
    $ git add *
    $ git commit -m "update test branch"
    [test 0bc3710] update test branch
     2 files changed, 2 insertions(+)
     create mode 100644 file2
    $ git diff master test 
    diff --git a/file1 b/file1
    index fa49b07..17059cd 100644
    --- a/file1
    +++ b/file1
    @@ -1 +1,2 @@       //意思就是目标文件的第1行开始的2行与源文件第一行有差异
     new file
    +branch test        //目标文件的差异就在这了
    diff --git a/file2 b/file2
    new file mode 100644
    index 0000000..80e7991
    --- /dev/null       //源文件没有该文件
    +++ b/file2
    @@ -0,0 +1 @@
    +new file2
    

    注释:

    //git diff 结果分析
    ---代表源文件  
    +++代表目标文件
    
    -开头的行,是只出现在源文件中的行
    +开头的行,是只出现在目标文件中的行
    空格开头的行,是源文件和目标文件中都出现的行
    差异按照差异小结进行组织,每个差异小结的第一行都是定位语句,由@@开头,@@结尾。
     
    
    • 更多的比较选项

    如果你要查看当前的工作目录与另外一个分支的差别,你可以用下面的命令执行:

    $ git diff test
    

    你也以加上路径限定符,来只比较某一个文件或目录:

    $ git diff test file1
    

    --stat参数可以统计一下有哪些文件被改动,有多少行被改动:

    $ git diff test --stat
     file1 | 1 -
     file2 | 1 -
     2 files changed, 2 deletions(-)
    

    <div class="divider"></div>

    • Git日志
      git log命令可以显示所有的提交(commit):
    $ git log
    //具体使用查阅help
    $ git help log
    
    • 比较提交 - Git Diff

    现在我们对项目做些修改:

    jackpon@jackpon:~/MyGit_repository$ cd gitproject/
    jackpon@jackpon:~/MyGit_repository/gitproject$ echo "new line" >> README.md
    jackpon@jackpon:~/MyGit_repository/gitproject$ echo "new file" >> file1
    

    使用git status查看当前修改的状态:

    jackpon@jackpon:~/MyGit_repository/gitproject$ git status
    位于分支 master
    您的分支与上游分支 'origin/master' 一致。
    尚未暂存以备提交的变更:
      (使用 "git add <文件>..." 更新要提交的内容)
      (使用 "git checkout -- <文件>..." 丢弃工作区的改动)
    
        修改:     README.md
    
    未跟踪的文件:
      (使用 "git add <文件>..." 以包含要提交的内容)
    
        file1
    
    修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
    

    可以看到一个文件修改了,另外一个文件添加了。如何查看修改的文件内容呢,那就需要使用git diff命令。git diff命令的作用是比较修改的或提交的文件内容。

    jackpon@jackpon:~/MyGit_repository/gitproject$ git diff
    diff --git a/README.md b/README.md
    index 21781dd..410e719 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,2 +1,3 @@
     gitproject
     ==========
    +new line
    

    命令输出当前工作目录中修改的内容,并不包含新加文件,请注意这些内容还没有添加到本地缓存区。

    将修改内容添加到本地缓存区,通配符可以把当前目录下所有修改的新增的文件都自动添加:

    $ git add *
    

    再执行git diff会发现没有任何内容输出,说明当前目录的修改都被添加到了缓存区,如何查看缓存区内与上次提交之间的差别呢?需要使用--cached参数:

    jackpon@jackpon:~/MyGit_repository/gitproject$ git diff --cached
    diff --git a/README.md b/README.md
    index 21781dd..410e719 100644
    --- a/README.md
    +++ b/README.md
    @@ -1,2 +1,3 @@
     gitproject
     ==========
    +new line
    diff --git a/file1 b/file1
    new file mode 100644
    index 0000000..fa49b07
    --- /dev/null
    +++ b/file1
    @@ -0,0 +1 @@
    +new file
    

    可以看到输出中已经包含了新加文件的内容,因为file1已经添加到了缓存区。
    最后我们提交代码再执行git diff --cached

    $ git commit -m 'update code'
    [master 96b0176] update code
     2 files changed, 2 insertions(+)
     create mode 100644 file1
    

    可以发现什么都没有输出。

    相关文章

      网友评论

        本文标题:Git的基本操作

        本文链接:https://www.haomeiwen.com/subject/xbxrkftx.html