git操作指南

2019-02-25  本文已影响0人  汤圆毛毛

一. git安装配置

1. 安装git

下载地址

安装完成后,在任意目录下 右键 ==> Git Bash Here 就会弹出命令行窗口,说明安装成功。

2. 配置git

配置git时,首先确保拥有 github 账号。 该步骤配置你的 github 的用户名和邮箱。

配置命令:(引号内换成自己的用户名和邮箱)

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

查看当前git用户信息

$ git config user.name
$ git config user.email

二. 仓库管理

1. 创建本地仓库

创建一个空文件夹作为新的仓库(选择一个已存在的目录也可以) 以 E:\mygit 目录为例

进入 E:\mygit 目录下, 在该文件夹下 右键 ==> Git Bash Here

$ git init
Initialized empty Git repository in E:/mygit/.git/

mygit 目录下会出现一个 .git 目录,则本地仓库创建成功。 .git 是进行版本跟踪管理的。

2. git 区域介绍

git仓库创建完成之后包括了工作区和版本库,版本库主要的区域包括: 暂存区、 分支

     工作区     add      暂存区    commit       分支
  (本地目录)  ====>>  (stage)   ====>>  (本地当前分支)

工作区: 即工作的区域,为mygit文件夹
暂存区: 版本库中的暂存区,称为stage
分支:   Git会自动创建一个master分支,默认当前分支为master分支

3. git 仓库操作

\mygit 目录下(工作区)创建一个空文件 test.txt ,并提交到仓库中。

  $ git add test.txt                   将test.txt从工作区加到暂存区
  $ git rm --cached test.txt           将test.txt从暂存区撤回
  $ git commit -m "create test.txt"    将test.txt从暂存区提交到分支

此时,test.txtgit仓库管理了。

git addgit commit 命令:

1 $ git add .                  将工作区中所有内容加到暂存区(注意:有个点 . )
2 $ git add file1  file2       将工作区中的 file1 和 file2 加到暂存区

3 $ git commit -m "comment"    提交到暂存区并为该提交添加一个描述信息(便于理解该提交进行的修改)

4 $ git commit -am "comment"   该命令是1和3的结合,效果等同于 `1+3` 操作

5 $ git status                 查看当前仓库状态
  (1) nothing to commit, working tree clean      工作区和暂存区干净
 (2)changes not staged for commit               工作区的修改未add进暂存区
 (3) changes to be commit                       暂存区的修改未commit

git diff 命令

  git diff                 比较的是工作区和暂存区的差别
  git diff --cached        比较的是暂存区和版本库的差别
  git diff HEAD -- file    可以查看该文件在工作区和版本库里的差别

三. 版本管理

1. 为 test.txt 设置三个版本

\mygit 仓库中的 test.txt 增加内容 abc,提交

 $ git add test.txt
 $ git commit -m "add abc"

test.txt 增加内容 “This is a version test”, 提交

 $ git add test.txt
 $ git commit -m "add sentence"

此时,仓库中的test有三个版本: 创建的test, 增加 abc 后的test, 增加“This is a version test”后的test。 可以用 git log 查看提交日志信息。

$ git log
commit 671b83b096c1d68c5c80396252c5d27e299ef315 (HEAD -> master)                   ===>> 最新一次提交的版本号
Author: wangchangyuan <wangchangyuan@hikvision.com.cn>
Date:   Thu Nov 9 16:34:01 2017 +0800

add sentence                                                                       ===>> 提交的信息

commit 6de209cfd436cd05ffa7d6c82956ed1d400440bc                                    ===>> 历史提交
Author: wangchangyuan <wangchangyuan@hikvision.com.cn>
Date:   Thu Nov 9 16:28:12 2017 +0800

add abd

commit 950f14488316b4839d19983cad220caa584d2a36                                    ===>> 历史提交
Author: wangchangyuan <wangchangyuan@hikvision.com.cn>
Date:   Thu Nov 9 16:27:19 2017 +0800

create test.txt

git log 的简化版

$ git log --pretty=oneline

671b83b096c1d68c5c80396252c5d27e299ef315 (HEAD -> master) add sentence
6de209cfd436cd05ffa7d6c82956ed1d400440bc add abd
950f14488316b4839d19983cad220caa584d2a36 create test.txt

2. 版本回退 git reset --hard

当前版本用 HEAD 表示 , 上一版本用 HEAD^表示,上上版本用HEAD^^表示, 每一版本都有自己的版本号,即上面那一长串数字。

(1) 回退到上一个版本

$ git reset --hard HEAD^
HEAD is now at 6de209c add abd

(2) 回退到指定版本

$ git reset --hard 950f                   ===>> 加版本号的前几位数字即可
HEAD is now at 950f144 create test.txt

此时HEAD指向的是回退过去的版本。

回退到过去的版本后,还可以再回到未来的某一版本,此时通过 git reflog 找到未来版本的版本号,然后设置head指向该版本即可。

$ git reflog
950f144 (HEAD -> master) HEAD@{0}: reset: moving to 950f
6de209c HEAD@{1}: reset: moving to HEAD^
671b83b HEAD@{2}: commit: add sentence
6de209c HEAD@{3}: commit: add abd
950f144 (HEAD -> master) HEAD@{4}: commit (initial): create test.txt

$ git reset --hard 671b
HEAD is now at 671b83b add sentence

3. 撤销修改

3.1 撤销工作区的修改

对工作区的文件进行了修改,但还没有 git add 进暂存区, 可以用 git status 看状态。撤销工作区的修改:

git checkout -- test.txt

3.2 撤销暂存区的修改

对工作区的文件进行了修改,并且 git add 进了暂存区,可以用 git status 看状态。撤销修改:

$ git reset HEAD test.txt          ===>> 把暂存区的修改撤回,重新放入工作区
$ git checkout -- test.txt         ===>> 把工作区的修改撤回

4. 文件删除

首先先建立一个文件用于测试演示: test_rm.txt

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

          deleted:test_rm.txt

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

4.1 工作区的文件误删

此时只需要撤销该操作即可:

$ git checkout -- test_rm.txt

4.2 确认删除版本库中的文件

$ git rm test_rm.txt                       ===>> 删除工作区中的test_rm.txt
$ git commit -m "delete test_rm.txt"       ===>> 提交删除操作

四. 远程仓库

1. 创建关联远程仓库

远程仓库可以搭建在github上,也可以搭建在私有服务器上。在github上是图形操作,可以 create一个新的仓库。

对于远程的仓库既可以从远程仓库克隆到本地,也可以和已有本地仓库进行连接。

建立连接后,可以查看远程仓库信息:

$ git remote -v

1.1 克隆远程仓库到本地,远程仓库地址为: git@1.1.1.1:user/moirai.git

在本地一个目录下克隆

$ git clone git@1.1.1.1:user/moirai.git

从远程仓库克隆时,已经自动将 git 本地仓库的 master 分支和远程仓库的 master 分支对应起来了, 远程仓库默认名为 origin

1.2 将已存在的本地仓库与远程仓库连接,在本地仓库主目录下:(origin是远程库的名字,默认都是origin

$ git remote add origin git@1.1.1.1:user/moirai.git

解除与远程仓库的关联:

$ git remote remove <name>      默认情况下 <name> 是origin

2. 推送远程仓库

有了远程仓库之后,可以把本地仓库的内容推送到远程仓库:

$ git push -u origin master         ===>> master是分支名

master是指把当前master分支推送到远程仓库;

-u是把本地master分支和远程master分支进行关联, 之后可以省略-u参数

3. 拉取远程仓库

当远程仓库被其他人提交修改后,自己在 push 时会出错, 此时需要先从远程仓库中 pull 最新的提交,如果有冲突则在本地合并后再 push

 $ git pull 

4. 获取远程仓库

从远程仓库获取他人的提交,但在本地不会自动的merge。 而 git pull 拉取到本地后会自动merge

 $ git fetch origin master
 $ git merge origin/master

五. 分支管理

git 仓库默认的分支为 master 主分支,前面版本回退提到的 HEAD 实际是指向当前分支 master, 图中每个节点是一次提交,当版本回退时实际是将 master 指向了前面的节点。

[图片上传失败...(image-4dfffa-1551108699579)]

1. 创建分支

git仓库中默认处于 master 分支,开发时一般将 master 分支作为稳定版本发布的分支,会另建一个分支作为开发分支。创建一个 develop 分支:

 $ git branch develop

2. 切换分支

默认所处分支为 master , 切换到 develop 分支上去:

$ git checkout develop

其实1+2的功能可以用下面命令合并实现:

$ git checkout -b develop                ===>>创建并切换到分支 develop

在创建分支的同时与远程仓库的分支对应起来:

$ git checkout -b develop origin/develop
或者
$ git branch --set-upstream develop orgin/develop

3. 查看当前分支

查看当前处于哪个分支:

$ git branch
* develop                            ===>> 展示出所有分支,当前分支前带 * 号
  master

4. 合并分支

4.1 无冲突合并

只在 develop 分支上对 test.txt 进行一次修改并提交:

$ git add test.txt
$ git commit -m "add test info for develop"

切换回 master 分支

$ git checkout master

查看 test.txt 文件,发现刚才的修改不见了。 这是因为修改是发生在 develop 分支上,对 master 分支没影响。

修改完之后可以将 develop 分支与 master 分支进行合并。 (注意当前是在 master 分支上)

$ git merge develop         ===>> 将 develop 分支合并到当前 master 分支上

4.2 有冲突合并

develop 分支上修改了test.txt, 同时切换回 master 分支后也进行修改, 合并时会有冲突:

$ git merge develop
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

根据提示要先解决冲突, 此时查看 Test.txt 内容:

abc
this is a git test file.
<<<<<<< HEAD

add merge and conflict for master
=======
add something to  test the develop branch.

test branch merge and conflict
>>>>>>> develop

这是因为在不同的分支上对同一个文件都进行了修改,需要手动解决冲突,修改完 test.txt 之后重新 git addgit commit即可修复冲突。

4.3 查看分支合并

git log --graph 可以查看分支合并图的情况。 --pretty=oneline 表示一行显示; --abbrev-commit 表示只显示 commit 版本号和comment信息

$  git log --graph --pretty=oneline --abbrev-commit
*   ee60ae5 (HEAD -> master) conflict fixed
|\
| * ee7b768 (develop) add merge info for develop
| * b17679a add test info for develop
* | 1decf7a add merge info for master
|/
* 6970fc4 delete test_rm.txt
* d82b873 add test_rm.txt
* 671b83b add sentence
* 6de209c add abd
* 950f144 create test.txt

4.4 不同合并方式

在4.1 采用的分支合并方式是 Fast forward 模式:

$ git merge develop
Updating ff3d8cc..c283635
Fast-forward
 test.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

另一种合并模式是 --no-ff

  $ git merge --no-ff -m "merge without fast-forward" develop

比较两者区别:

Fast-forward: 快速合并模式,将 `HEAD` 快速地指向 `develop` 分支的当前提交。该方式没有对合并进行 `commit`,在删除该分支后会丢失该分支的信息。

--no-ff:      保留分支的 `commit` 历史信息, 所以该命令需要有 `-m` 参数,并增加提交的说明信息。

5. 删除分支

合并完分支之后,可以将其删除:

  $ git branch -d develop

强制删除:

  $ git branch -D develop

6. 暂储分支

正在某个分支上进行开发,但临时需要先建立新分支去进行其他的工作,建立分支前需要将当前分支的修改进行提交,但此时修改内容还不能 commit。 此时可以将当前分支的修改暂时储藏起来 git stash

$ git stash

这样工作区就是干净的了,可以建立新分支。

回到刚才分支恢复工作区的修改, 有两种恢复方式:

     $ git stash list        ===>> 查看stash的内容
   1 $ git stash apply       ===>> 恢复stash内容,同时保留了stash内容
   2 $ git stash pop         ===>> 恢复stash内容,同时删除了stash内容

对于多次stash的内容,在恢复时可以选择性的恢复:

$ git stash apply stash@{0}        ===>>表示恢复 stash@{0}

六. 标签管理

git 的 commit 版本号是一串很长的数字,难以区分版本。 所以为版本打一个容易理解的标签很重要。

  1. 为当前最新版本打标签:

     $ git tag v1.0       ===>>为当前版本打标签: v1.0
    
  2. 为之前提交的版本打标签:

     $ git tag v0.1 commit-id       ===>>commit-id指的是之前版本提交的版本号id
    
  3. 为某个版本打上带有说明的标签:

     $ git tag -a v0.2 -m "comment" commit-id     ===>>为commit-id版本打上说明为 “comment”的标签
    
  4. 查看当前分支中的标签:

     $ git tag
    
  5. 查看某个标签的详细信息:

     $ git show v1.0
    
  6. 删除标签:

     $ git tag -d v1.0           ===>> 删除v1.0这个标签
    
  7. 标签推送到远程仓库:

     $ git push origin v1.0          ===>> 将标签v1.0推送到远程
     $ git push origin --tags        ===>> 将所有标签一次性推送到远程
    
  8. 删除远程标签:

      $ git tag -d v1.0                        ===>>先将本地标签删除
      $ git push origin :refs/tags/v1.0        ===>>再将远程标签删除
    

七. 命令附录

  1. 本地仓库基础操作

     $ git init                         ==>初始化本地仓库
     $ git add file/files/.             ==>增加文件到暂存区
     $ git commit -m "comment"          ==>提交到版本库
     $ git status                       ==>查看仓库状态
     $ git diff                         ==>查看修改内容
     $ git log                          ==>查看提交历史
     $ git reflog                       ==>查看命令历史
    
  2. 版本操作

     $ git reset --hard commit-id       ==>版本回退到commit-id
     $ git reset --hard HEAD^           ==>版本回退到上次提交
    
  3. 删除操作

     $ git checkout -- file             ==>撤销工作区file的修改
     $ git reset HEAD file              ==>撤销暂存区file的修改
     $ git rm file                      ==>删除工作区的file
     $ git commit -m "delete file"      ==>提交对file的删除操作
    
  4. 远程仓库操作

     $ git remote -v                                                ==>查看远程库信息
     $ git remote add origin git@server-name:path/repository.git    ==>关联远程仓库
     $ git clone git@server-name:path/repository.git                ==>克隆远程仓库
     $ git push -u origin master                                    ==>首次推送本地master分支内容到远程仓库
     $ git pull                                                     ==>拉取远程仓库内容并自动本地融合
     $ git fetch                                                    ==>拉取远程仓库内容,不自动融合
    
  5. 分支操作

        $ git branch                                       ==>查看当前分支
        $ git branch <name>                                ==>创建新分支    
        $ git checkout <name>                              ==>切换到分支 
        $ git checkout -b <name>                           ==>创建并切换到新分支 
        $ git merge <name>                                 ==>将分支合并到当前分支
        $ git merge --no-ff -m "comment" <name>            ==>非Fast-forward方式合并分支到当前分支
        $ git branch -d <name>                             ==>删除分支 
        $ git branch -D <name>                             ==>强制删除分支 
        $ git log --graph                                  ==>查看分支合并图
        
        $ git checkout -b branch-name origin/branch-name   ==>在本地建立与远程分支对应的分支         
        $ git branch --set-upstream branch origin/branch   ==>将本地已有的分支与远程分支建立关联   
    
  6. 暂存分支工作现场

        $ git stash                                    ==>将当前分支的工作现场储藏
        $ git stash list                               ==>查看储藏起来的工作现场
        $ git stash apply                              ==>恢复工作现场,保留stash内容
        $ git stash drop                               ==>删除stash内容
        $ git stash pop                                ==>恢复工作现场同时删除stash内容   
    
  7. 标签操作

        $ git tag                                           ==>查看当前所有标签信息
        $ git tag <tag-name>                                ==>为当前分支最新的提交打标签      
        $ git tag <tag-name> commit-id                      ==>为当前分支 commit-id标识的提交打标签
        $ git show <tag-name>                               ==>查看标签 <tag-name> 的详细信息
        $ git tag -a <tag-name> -m "comment" commit-id      ==>为提交打上带有说明的标签
    
上一篇下一篇

猜你喜欢

热点阅读