Git. Day 3 撤销+远程仓库的使用(Git 基础.第二章结束)


  开头的废话总是少不了的,昨天晚上去接我家的大爷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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容