教你学会优雅使用Git精选集合

11 篇文章 0 订阅
11 篇文章 0 订阅

自述

这是我的博客地址->神州部落格
欢迎来访哦······

为什么学习git

经过一段时间的git基础命令的使用,我发现git还有很多地方不懂,比如说本地和仓库之间起冲突了怎么解决。

了解git

  • git是和GitHub交互的渠道,学会git必不可少,它会让你的工作更加轻松。
  • Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit pull,后面我们会详细介绍。

image-20200907184728050

说明

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:或本地仓库
  • remote repository:远程仓库

基础操作

git init //git初始化
git add . // 加入本地仓库 添加文件到暂存区。
git commit  //提交GitHub 将暂存区内容添加到仓库中。

创建仓库

git init

git clone +GitHub仓库地址 拷贝一份远程仓库,也就是下载一个项目。

提交与修改

git add .git statusgit diffgit commitgit resetgit rmgit mv
添加文件到仓库 查看仓库当前的状态,显示有变更的文件。 比较文件的不同,即暂存区和工作区的差异。 提交暂存区到本地仓库。 回退版本。 删除工作区文件。
删除工作区文件。

提交日志

git log //查看历史提交记录

远程操作

git reset

不带 --hard 只是git记录返回上一次提交

带了 --hard是连文件一起返回上一次提交,即误删的文件又回来了

不带就是删掉文件不要了,带就是删掉的文件还要。

git reset 回退 恢复暂存区域

use “git reset HEAD …” to unstage 的意思是“如果你反悔了,你可以使用 git reset HEAD 命令恢复暂存区域”。如果后面接文件名,表示恢复该文件;如果不接文件名,则表示上一次添加的文件。

F:\MyProject>git reset HEAD

F:\MyProject>git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        LICENSE(红色)

nothing added to commit but untracked files present (use "git add" to track)
git pull

git pull 命用于从远程获取代码并合并本地的版本。

git pull <远程主机名> <远程分支名>:<本地分支名>
git pull 更新
git pull origin master:brantest //将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并
git pull origin master //如果远程分支是与当前分支合并,则冒号后面的部分可以省略。


如:

$ git remote -v  # 查看信息
origin    https://github.com/tianqixin/runoob-git-test (fetch)
origin    https://github.com/tianqixin/runoob-git-test (push)

$ git pull origin master
From https://github.com/tianqixin/runoob-git-test
 * branch            master     -> FETCH_HEAD
Already up to date.
git pull

git push 命用于从将本地的分支版本上传到远程并合并。

git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master //以下命令将本地的 master 分支推送到 origin 主机的 master 分支。
相当于git push origin master:master
git push --force origin master //如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:
git push origin --delete master //删除主机但分支可以使用 --delete 参数,表示删除 origin 主机的 master 分支

如:

$ touch runoob-test.txt      # 添加文件
$ git add runoob-test.txt 
$ git commit -m "添加到远程"
master 69e702d] 添加到远程
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 runoob-test.txt

$ git push origin master    # 推送到 Github
将本地的 master 分支推送到 origin 主机的 master 分支。

重新回到我们的 Github 仓库,可以看到文件已经提交上来了:image-20200907191624338

git分支

创建分支

创建分支,使用 git branch 分支名 命令:git branch feature

没有任何提示说明分支创建成功(一般也不会失败啦,除非创建了同名的分支会提醒你一下),此时可以执行 git log --decorate 命令查看:

如果希望以“精简版”的方式显示,可以加上一个 --oneline 选项(即 git log --decorate --oneline),这样就只用一行来显示一个快照记录。

可以看到最新的快照后边多了一个 (HEAD -> master, feature)

它的意思是:目前有两个分支,一个是主分支(master),一个是刚才我们创建的新分支(feature),然后 HEAD 指针仍然指向默认的 master 分支。

所以目前仓库中的快照应该是这样:

image-20200907193046585

切换分支

现在我们需要将工作环境切换到新创建的分支(feature)上,使用的就是之前我们欲言又止的 checkout 命令。执行 git checkout feature 命令:git checkout feature

image-20200907193210473

现在我们进行一次提交(暂存区域还有一个更改的文件没有提交呢):

image-20200907193249273

然后我们将 HEAD 指针切回 master 分支:git checkout master

细心的朋友会发现上一次对 README.md 文件的修改已经荡然无存了,这是因为我们的工作目录已经回到 master 分支的状态中:

image-20200907193443059

现在对 README.md 文件进行修改(随便改改),然后执行 git commit -m "再次修改说明文件"

image-20200907193626264

执行 git log --oneline --decorate --graph --all 命令:

–graph 选项表示让 Git 绘制分支图,–all 表示显示所有分支

image-20200907193719647

合并分支

当一个子分支的使命完结之后,它就应该回归到主分支中去。

image-20200907193741087

合并分支我们使用 merge 命令,执行git merge feature 命令,将 feature 分支合并到 HEAD 所在的分支(master)上

image-20200907193815136

从 Git 提示的内容来看,我们知道这次的合并并没有成功,Git 说:

合并 README.md 文件的时候出现冲突。

所以自动合并失败;请修改冲突的内容并重新提交快照。

意思是说现在你需要先解决冲突的问题,Git 才能进行合并操作。所谓冲突,无非就是像两个分支中存在同名但内容却不同的文件,Git 不知道你要舍弃哪一个或保留哪一个,所以需要你自己来决定。
此时执行 git status 命令也会显示需要你解决的冲突:

image-20200907193913448

然后 Git 会在有冲突的文件中加入一些标记,不信你打开 README.md 文件看看:

image-20200907193934727

以“=======”为界,上到“<<<<<<< HEAD”的内容表示当前分支,下到“>>>>>>> feature”表示待合并的 feature 分支,之间的内容就是冲突的地方。

现在我们将 README.md 统一修改(去掉 <<<<<<< HEAD 等内容)
保存文件,然后提交快照:

image-20200907194012359

执行 git log --decorate --all --graph --oneline 命令,可以看到此时的分支已经自动合并了:

image-20200907194025455

删除分支

删除分支,使用 git branch -d 分支名 命令:

image-20200907194335231

执行 git log --decorate --all --graph --oneline 命令:

image-20200907194348391由于 Git 的分支原理实际上只是通过一个指针记载,所以创建和删除分支都几乎是瞬间完成。

注意:如果试图删除未合并的分支,Git 会提示你“该分支未完全合并,如果你确定要删除,请使用 git branch -D 分支名 命令。

checkout 命令和 reset 命令的区别

恢复文件

checkout 命令和 reset 命令都可以用于恢复指定快照的指定文件,并且它们都不会改变 HEAD 指针的指向。

下面开始划重点:

它们的区别是 reset 命令只将指定文件恢复到暂存区域(–mixed),而 checkout 命令是同时覆盖暂存区域和工作目录。

注意:也许你试图使用 git reset --hard HEAD~ README.md 命令让 reset 同时覆盖工作目录,但 Git 会告诉你这是徒劳(此时 reset 不允许使用 --soft 或 --hard 选项)。

这样看来,在恢复文件方面,reset 命令要比 checkout 命令更安全一些。

恢复快照

reset 命令是用来“回到过去”的,根据选项的不同,reset 命令将移动 HEAD 指针(–soft) -> 覆盖暂存区域(–mixed,默认)-> 覆盖工作目录(–hard)。

checkout 命令虽说是用于切换分支,但前面你也看到了,它事实上也是通过移动 HEAD 指针和覆盖暂存区域、工作目录来实现的。

那问题来了:它们有什么区别呢?

下面开始划重点:

第一个区别是,对于 reset --hard 命令来说,checkout 命令更安全。因为 checkout 命令在切换分支前会先检查一下当前的工作状态,如果不是“clean”的话,Git 不会允许你这样做;而 reset --hard 命令则是直接覆盖所有数据。

另一个区别是如何更新 HEAD 指向,reset 命令会移动 HEAD 所在分支的指向,而 checkout 命令只会移动 HEAD 自身来指向另一个分支。

image-20200907194651815

执行 git checkout feature 命令:

image-20200907194706143

可以看到只是 HEAD 指针跑到 feature 分支那儿去了。

好,我们执行 git checkout master 命令将其切回。

现在执行 git reset --hard feature 命令:

image-20200907194806334

版权声明

部分来自链接:https://www.jianshu.com/p/e57a4a2cf077

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值