自述
这是我的博客地址->神州部落格
欢迎来访哦······
为什么学习git
经过一段时间的git基础命令的使用,我发现git还有很多地方不懂,比如说本地和仓库之间起冲突了怎么解决。
了解git
- git是和GitHub交互的渠道,学会git必不可少,它会让你的工作更加轻松。
- Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,后面我们会详细介绍。
说明
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:或本地仓库
- remote repository:远程仓库
基础操作
git init //git初始化
git add . // 加入本地仓库 添加文件到暂存区。
git commit //提交GitHub 将暂存区内容添加到仓库中。
创建仓库
git init
git clone +GitHub仓库地址
拷贝一份远程仓库,也就是下载一个项目。
提交与修改
git add . | git status | git diff | git commit | git reset | git rm | git 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 仓库,可以看到文件已经提交上来了:
git分支
创建分支
创建分支,使用 git branch 分支名 命令:git branch feature
没有任何提示说明分支创建成功(一般也不会失败啦,除非创建了同名的分支会提醒你一下),此时可以执行 git log --decorate 命令查看:
如果希望以“精简版”的方式显示,可以加上一个 --oneline 选项(即 git log --decorate --oneline),这样就只用一行来显示一个快照记录。
可以看到最新的快照后边多了一个 (HEAD -> master, feature)
它的意思是:目前有两个分支,一个是主分支(master),一个是刚才我们创建的新分支(feature),然后 HEAD 指针仍然指向默认的 master 分支。
所以目前仓库中的快照应该是这样:
切换分支
现在我们需要将工作环境切换到新创建的分支(feature)上,使用的就是之前我们欲言又止的 checkout 命令。执行 git checkout feature 命令:git checkout feature
现在我们进行一次提交(暂存区域还有一个更改的文件没有提交呢):
然后我们将 HEAD 指针切回 master 分支:git checkout master
细心的朋友会发现上一次对 README.md 文件的修改已经荡然无存了,这是因为我们的工作目录已经回到 master 分支的状态中:
现在对 README.md 文件进行修改(随便改改),然后执行 git commit -m "再次修改说明文件"
:
执行 git log --oneline --decorate --graph --all 命令:
–graph 选项表示让 Git 绘制分支图,–all 表示显示所有分支
合并分支
当一个子分支的使命完结之后,它就应该回归到主分支中去。
合并分支我们使用 merge 命令,执行git merge feature
命令,将 feature 分支合并到 HEAD 所在的分支(master)上
从 Git 提示的内容来看,我们知道这次的合并并没有成功,Git 说:
合并 README.md 文件的时候出现冲突。
所以自动合并失败;请修改冲突的内容并重新提交快照。
意思是说现在你需要先解决冲突的问题,Git 才能进行合并操作。所谓冲突,无非就是像两个分支中存在同名但内容却不同的文件,Git 不知道你要舍弃哪一个或保留哪一个,所以需要你自己来决定。
此时执行 git status 命令也会显示需要你解决的冲突:
然后 Git 会在有冲突的文件中加入一些标记,不信你打开 README.md 文件看看:
以“=======”为界,上到“<<<<<<< HEAD”的内容表示当前分支,下到“>>>>>>> feature”表示待合并的 feature 分支,之间的内容就是冲突的地方。
现在我们将 README.md 统一修改(去掉 <<<<<<< HEAD 等内容)
保存文件,然后提交快照:
执行 git log --decorate --all --graph --oneline 命令,可以看到此时的分支已经自动合并了:
删除分支
删除分支,使用 git branch -d 分支名 命令:
执行 git log --decorate --all --graph --oneline 命令:
由于 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 自身来指向另一个分支。
执行 git checkout feature 命令:
可以看到只是 HEAD 指针跑到 feature 分支那儿去了。
好,我们执行 git checkout master 命令将其切回。
现在执行 git reset --hard feature 命令:
版权声明
部分来自链接:https://www.jianshu.com/p/e57a4a2cf077