开头的废话总是少不了的,昨天晚上去接我家的大爷Mercy啦,所以昨天没来得及更新博客,又多了一个小伙伴,最近项目上也遇到一些阻力了,都是新的东西,但是自己又没有那么想去研究,无论如何,还是会抽出时间按时更新博客,更多的是对自己的鞭策,希望能对你们也有帮助。
另外,我已经开了多说的评论系统,我的博客现在开始可以评论啦,写了这是第六篇还没有一个人来评论,简直无情!
今天把Git的进度加快一点,结束掉基础篇。
内容提示:
- 撤销操作
- 远程仓库的使用
- 其他技巧
撤销操作
-
修改最后一次提交
在提交代码时,如果发现之前的提交有问题,那么我们可以进行撤销操作:
$ git commit -amend #撤销提交操作
另外,官方文档中也提示我们,如果我们是在提交之后,又多添加了一个文件到暂存区域,再执行刚才这个命令,那么我们相当于在提交之前对暂存区域的文件目录进行修改,然后再提交,而不是提交两次(相当于对第一次提交的结果进行修正后,再提交):
$ git commit -m "new commit ,changed the version" #提交修改
$ git add file_name.fileType #添加file_name.fileType 到暂存区
$ git commit -amend #将新添加的文件 以及 上次想要提交的文件 合并一起放到暂存区,然后再提交。
-
从暂存目录中排除文件
刚才已经试过了怎么样对暂存目录添加文件,现在看看怎么从暂存目录中去除多余的文件,命令 ( 格式 :git reset HEAD <file>... ):
$ git reset HEAD benchmarks.rb#从暂存区中去除benchmarks.rb这个文件
其实这个命令是不用去记的,一般在你add文件到暂存区,都会有对应的提示告诉你,怎么样去除你刚刚添加的文件。像这样的:
$ git add . #添加当前目录下所有文件到暂存区
$ git status #查看当前提交状态
On branch master #在分支 master上
Changes to be committed:#有要被提交的更改
(use "git reset HEAD <file>..." to unstage)#用XXX格式的命令就可以撤销
modified: README.txt#有修改的文件 README.txt
modified: benchmarks.rb #有修改的文件 benchmarks.rb
-
取消对文件的修改
可以看到我们观察的范围是从大到小的,最开始是从整个commit内容的角度,然后是add到暂存目录,接下来,那就是对单个文件的撤回。直接敲命令( 格式:git checkout -- <file>... ):
$ git checkout -- benchmarks.rb# 撤回对benchmarks.rb这个文件的修改
有一点需要注意的是,如果你对这个文件进行了上面的操作,那就是所有对它的更改都撤销了。这里其实我在看的时候有一个疑问,因为这个所有的更改,指的是上一次提交之后的修改,还是clone(或者创建)之后的修改。然后你也可以做一个实验 :
找一个文件夹作为仓库,然后新建一个readme.md文件,然后对这个文件进行编辑,然后add + commit这个文件。结束之后再修改一次(注意这里第二次修改应该与第一次修改有明显区别),然后再add+commit。然后我们执行上面这条命令,你会发现:
这个文件会回到第一次提交之后的状态:
下面是我操作的过程:
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx
$ git init #初始化Git环境
Initialized empty Git repository in D:/GITREPOS/Testcx/.git/
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ ls #查看当前目录
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ vim readme.md #新建文件readme.md
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ ls #查看当前目录
readme.md
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ vi readme.md#修改文件readme.md 这里会弹出对应的编辑的窗口,
#编辑完成之后,ctrl+c 然后 wq 或者 wq! 保存退出
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ cat readme.md#查看文件内容
INSERT
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git add readme.md#添加文件到暂存目录
warning: LF will be replaced by CRLF in readme.md.
The file will have its original line endings in your working directory.
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git commit -m "new readme.md"#提交暂存目录中的文件
[master (root-commit) 1d4b725] new readme.md
1 file changed, 2 insertions(+)
create mode 100644 readme.md
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ vi readme.md#修改仓库中的readme.md 文件
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ cat readme.md#查看readme.md修改后的结果
INSERT
UPDATE
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git checkout -- readme.md#撤销对readme.md 文件的操作
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ cat readme.md#查看撤销后的文件内容
INSERT
远程仓库的使用
-
查看远程仓库
在迈开第一步之前,我们首先得知道自己在哪,这是你需要的命令是:
$ git remote #查看当前连接的远程仓库
$ git remote -v #查看当前连接的远程仓库的详细信息 (-v == --verbose)
pb git@github.com:DendiSe7enGitHub/moreTestAboutGit.git (fetch)#抓取地址
pb git@github.com:DendiSe7enGitHub/moreTestAboutGit.git (push)#提交地址
-
添加远程仓库
如果你在第一步直接执行git remote很有可能你会发现没有任何结果,因为你并没有添加过远程仓库,你只是新建了一个本地的仓库。这时候你可以先执行这一步:
注意:我执行的命令中 为远程仓库取了名字‘pb’
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
#添加一个远程仓库 并且取别名为'pb'
$ git remote add pb git@github.com:DendiSe7enGitHub/moreTestAboutGit.git
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
#显示当前远程仓库
$ git remote
pb
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
#显示远程仓库的详细信息
$ git remote -v
pb git@github.com:DendiSe7enGitHub/moreTestAboutGit.git (fetch)
pb git@github.com:DendiSe7enGitHub/moreTestAboutGit.git (push)
-
从远程仓库抓取数据 & 推送数据到远程仓库
现在我们已经知道自己在哪儿了,而且我们已经可以到我们想到的地方,那接下来就是在这个地方做我们想做的事情,比如说:抓取数据和推送数据
抓取数据:
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git fetch pb #从我们现在连接的远程仓库抓取数据
warning: no common commits
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 7 (delta 0), reused 7 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
From github.com:DendiSe7enGitHub/moreTestAboutGit
#抓取到新的分支master,因为我是新建的一个本地repos所以本来是没有brach的
* [new branch] master -> pb/master
推送数据( 格式:git push [remote-name] [branch-name] ):
按照上面的格式我执行了下面的代码,但是发现报错
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git push pb master#push本地内容到远程仓库上
To github.com:DendiSe7enGitHub/moreTestAboutGit.git#push的路径
! [rejected] master -> master (non-fast-forward)#我的push被拒绝
error: failed to push some refs to 'git@github.com:DendiSe7enGitHub/moreTestAboutGit.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
我们单独把错误拿出来看(我去掉了最后一句并且重新分段过):
Updates were rejected #更新被拒绝
#因为你当前的分支的顶端在其远程副本的后面。
because the tip of your current branch is behind its remote counterpart.
#在你下次提交之前合并远程的修改到本地
Integrate the remote changes (e.g.'git pull ...') before pushing again.
原谅我弱爆的翻译水平,这里面其实第二句会比较难理解,那是什么意思呢?我举个栗子来解释下:假设我们每个仓库都有一个开头A,一个结尾B。那么我们对应的远程副本也有其对应的开头A1,结尾B1,那这句话的意思是,我从远程副本的A1一直找到B1都没看到你的A啊,我怎么给你提交啊。
引起整个问题的原因,是因为我本地新建了一个repos,完全是崭新的repos,但是我远程仓库里面,本来就是有东西的,所以我在提交的时候完全就是全新的东西,跟远程的repos没有任何关系,所以git一对比发现,诶,你让我往哪儿插?
问题我们明白了,怎么解决呢?我是在这里找到的答案。(需要翻墙,所以我把对方的回答也复制下来)
原文:
"git merge" used to allow merging two branches that have no common base by default, which led to a brand new history of an existing project created and then get pulled by an unsuspecting maintainer, which allowed an unnecessary parallel history merged into the existing project. The command has been taught not to allow this by default, with an escape hatch "--allow-unrelated-histories" option to be used in a rare event that merges histories of two projects that started their lives independently.
You can use --allow-unrelated-histories to force the merge to happen.
前面是描述原因,最后一句是怎么解决
#取回远程主机某个master 的更新,再与本地的master 合并
#git pull pb master:master
#我省略了:master 是因为我们现在就是与本地的master分支合并
$ git pull pb master --allow-unrelated-histories
#后面 '--allow-unrelated-histories '允许合并历史无关的内容
From github.com:DendiSe7enGitHub/moreTestAboutGit
* branch master -> FETCH_HEAD
Merge made by the 'recursive' strategy.
README.md | 0
READMORE | 12 ++++++++++++
gitignore | 6 ++++++
3 files changed, 18 insertions(+)
create mode 100644 README.md
create mode 100644 READMORE
create mode 100644 gitignore
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git push pb master#将本地repos推送到远程仓库
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 542 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local objects.
To github.com:DendiSe7enGitHub/moreTestAboutGit.git
7bd6f76..9f012bb master -> master
搞定!
-
查看远程仓库信息
直接上命令:
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git remote show pb
* remote pb
Fetch URL: git@github.com:DendiSe7enGitHub/moreTestAboutGit.git
Push URL: git@github.com:DendiSe7enGitHub/moreTestAboutGit.git
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (up to date)
-
远程仓库的删除和重命名
直接上命令:
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git remote rename pb dendiRepo#将远程仓库pb改成dendiRepo
Dendoink@QELRM4A8Y4JCC8E MINGW64 /d/GITREPOS/Testcx (master)
$ git remote
dendiRepo
$ git remote rm paul#这里我没有删除自己的分支用的是例子的代码
$ git remote
origin