git操作指南

一. git安装配置 【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 file1file2将工作区中的 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 Date:Thu Nov 9 16:34:01 2017 +0800add sentence===>> 提交的信息commit 6de209cfd436cd05ffa7d6c82956ed1d400440bc===>> 历史提交 Author: wangchangyuan Date:Thu Nov 9 16:28:12 2017 +0800add abdcommit 950f14488316b4839d19983cad220caa584d2a36===>> 历史提交 Author: wangchangyuan Date:Thu Nov 9 16:27:19 2017 +0800create test.txt

git log 的简化版
$ git log --pretty=oneline671b83b096c1d68c5c80396252c5d27e299ef315 (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 ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory)deleted:test_rm.txtno 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 默认情况下 是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. <<<<<<< HEADadd merge and conflict for master ======= add something totest 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 ==>创建新分支 $ git checkout ==>切换到分支 $ git checkout -b ==>创建并切换到新分支 $ git merge ==>将分支合并到当前分支 $ git merge --no-ff -m "comment" ==>非Fast-forward方式合并分支到当前分支 $ git branch -d ==>删除分支 $ git branch -D ==>强制删除分支 $ 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 ==>为当前分支最新的提交打标签 $ git tag commit-id==>为当前分支 commit-id标识的提交打标签 $ git show ==>查看标签 的详细信息 $ git tag -a -m "comment" commit-id==>为提交打上带有说明的标签

    推荐阅读