git + github 杂货铺

本文会持续更新,主要是用于记录 git 使用过程中的一些常见常用的技巧,方便日后查看。
文章结构以每个实际工作问题为一个cell来划分。
本文虽然有不少 git 的基础知识,但不侧重于新手的扫盲科普,所以对 git 一无所知的朋友可以先看廖雪峰大神的 git 教程:https://www.liaoxuefeng.com/

问题目录

  • 1. github URL地址发生变更后,本地仓库如何同步。
    • 问题描述
    • 解决方案一
    • 解决方案二
  • 2. 如何创建全新的 github 项目,并将本地仓库上传
    • 2.1. 创建 github 项目
    • 2.2. 上传本地仓库
  • 3. 本地有各种类型的修改, 如何只 'push' 其中一部分修改 。
    • 问题描述:
    • 解决方案:
  • 4. 如何解决版本'冲突'
    • 问题描述:
    • 解决方案:
  • 4. 如何撤销本地的一些修改
    • 问题描述:
    • 解决方案:

1. github URL地址发生变更后,本地仓库如何同步。

问题描述

例如我的 github 账户的 ID 为:CuuGit,我的账户里有一个项目:Constant。所以我的项目URL地址是如下这样:
git + github 杂货铺_第1张图片
我已将项目克隆至本地的 " c / MyGit " 目录下,所以项目在我本地的位置是:" c / MyGit / Constant "。本地已工作一段时间。
git + github 杂货铺_第2张图片
现在 github 上项目的 URL 发生改变,比如我心情好改了个 ID,导致账户上的所有项目 URL 地址发生变化(Don’t  imitate!!)。
对于该 Constant 项目效果如下:
git + github 杂货铺_第3张图片
可是我本地的项目内部还是以前的URL,但远程(gihub)上已变更,这就导致以后本地无法同步远程更新了。

解决方案一

  1. " cd " 到项目 Constant 中的隐藏目录 " . git " 中,用 vi 打开 config 文件:
    git + github 杂货铺_第4张图片
    此时可以看到 URL 地址为旧的 CuuGit :
    git + github 杂货铺_第5张图片
  2. 将 URL 更改为新的 Liam-Yang:
    git + github 杂货铺_第6张图片

解决方案二

  1. " cd " 到项目目录下," git remote "查看远程仓库记录:
    git + github 杂货铺_第7张图片
  2. 直接修改 config 文件存储的远程仓库 URL:
    git + github 杂货铺_第8张图片
    与方案一效果一模一样,用方案二也是修改了方案一中的 config 文件的 URL 地址。

2. 如何创建全新的 github 项目,并将本地仓库上传

2.1. 创建 github 项目

  1. 点击右上角 ‘+’ 号。
  2. 点击 ‘New repository’。
  3. 填写项目相关信息
  4. 下方的 ‘Initialize this repository with a README’ 为新建的项目中自带 ‘README.md’ 文件。

2.2. 上传本地仓库

  1. 本地建好的目录下 ‘git init’ 。
  2. 将目录中现有的文件 ‘add’ 和 ‘commit’
  3. ’ git remote add origin URL ’ 将项目的 URL 添加到本地仓库的配置文件中
  4. ’ git push origin master ’ 将仓库上传到远程仓库。origin:内部存储的是远程主机的URL,master:代表本地主分支。

3. 本地有各种类型的修改, 如何只 ‘push’ 其中一部分修改 。

问题描述:

假如我在参与一个 github 开源项目,我的计划是这样的:我要进行一些修改,并将这些修改 push 给作者以帮助完善项目。另外,我还要进行一些只属于我自己的修改,并不打算将这部分修改 push 给原作者,比如我添加了一些方便自己理解的备注呀之类的。

解决方案:

为了防止两种修改混乱,最好的办法是使用分支。

  1. 一个项目克隆到本地后默认只有一个 ‘主分支’:‘master’ 。我们用此分支来完成给作者上传修改。
  2. git branch Adam :创建一个名为 Adam 的分支。
  3. 查看分支:git branch 星号代表当前所处的分支。
  4. 切换分支:git checkout Adam
  5. 合并分支,在 Adam 分支下:git merge master 将master分支合并到Adam分支。(若需要)
  6. ’ git push [origin] [a] [b] ’ 将本地分支a上传到origin服务器上的远程分支b。如:git push origin Adam 远程服务器上若没有Adam分支则会自动创建。也可以直接推给已有的b分支。
  7. 在github上也可以查看和切换不同的分支。

4. 如何解决版本’冲突’

问题描述:

假如本地分支和对应的远程github分支名为:Adam。远程的 Adam 分支中的 ‘a.txt’ 被别人修改,我在没有 pull 的情况下直接在本地 Adam分支下也修改 'a.txt’文件,并且巧的是我们修改的是’a.txt’内的同一个地方!!然后修改完成后去 push 的时候就报错了,这就是冲突。实际工作中很常见,不同的人修改同一个文件的同一部位,导致系统不知道怎么合并。

解决方案:

入门手法---->手动修改,故事情节如下:

  1. commit 完成后,屁颠屁颠的去 git push origin Adam,然后系统提示错误,原因就是问题描述里的那样。
  2. 然后又屁颠屁颠去 git pull origin Adam,系统还是报错,原因还是描述里那个问题没解决。
  3. 此时去本地手动打开 ‘a.txt’ 文件,发现里边有点乱码的感觉,其实是远程的版本和本地的修改版本都在里边。
  4. 里边有一行 ’ ===== ’ ,这个是分界线,用来分隔远程的版本和本地的版本。然后手动删除了其中一个版本。
  5. 再一次 git push origin Adam ,哇,居然成功了。

4. 如何撤销本地的一些修改

问题描述:

假如我对本地的某个文件做了一个修改,然而后来我觉得这个修改不完美。所以我不想保留这个修改,或者不想将这个修改commit成版本,或者不想将这个修改推送至github等等。但有时候由于原文件太大,有几千行或者几万行,所以我无法方便的找到这个修改的位置。
有些朋友可能会说我构想的这个场景前后矛盾,你都知道这个修改不完美,然而你却不知道你改了什么地方?我举个具体的实例,假如我在阅读某个txt文档的过程中,无意中手碰到了键盘的空格键,导致在某行的末尾增加了个空格,当时由于各种原因并没有顺便删掉这个空格,事后也习惯性的Ctrl+S退出,然而git却能识别到这个修改。纳尼?难道要我在几千行的文档中去找那个空格吗?

解决方案:

  1. 现在我的本地 readme.md 文件内容如下,用 git status 查看状态显示没有任何修改。
    git + github 杂货铺_第9张图片
    git + github 杂货铺_第10张图片
  2. 现在我在 readme.md 中添加一行修改,可以看到 git status 已经识别到本次修改。
    git + github 杂货铺_第11张图片
    git + github 杂货铺_第12张图片
  3. 通过上图可以看出,本次修改还在工作区,使用 git checkout - - file 可撤销工作区中的修改。
    git + github 杂货铺_第13张图片
    git + github 杂货铺_第14张图片
    可以看到本地文件的修改也被清除了。
    上述的撤销分两种情况,如果你对文件进行了修改后并没有 git add 到暂存区,那么文件会回到修改前的状态,即修改从工作区移除。如果你对文件修改后进行了 git add,然后又进行了修改,那么文件会回到 git add 后的状态,即回到暂存区。总之,文件会回到最近一次修改前的状态。
  4. 若你再添加了上述那行修改后,又迷迷糊糊的进行了 git add,将文件添加到暂存区了,但是还没有 git commit。
    git + github 杂货铺_第15张图片
    git + github 杂货铺_第16张图片
  5. 不用怕,命令 git reset HEAD file 可以将暂存区的修改撤销,重新放回工作区。
    git + github 杂货铺_第17张图片
    可以看到修改已经从暂存区撤销,回到工作区的状态。再用前面讲过的方法将工作区的修改撤销掉即可。
  6. 若你不但将修改 git add 了,还 git commit 了,怎么办?别慌,会使用 git 的“版本回退”功能吗?
    这个如果有朋友不会,那我们有机会遇到需要使用这个的案例时再演示吧。
    但是版本回退有时候可能并不能满足你的要求,因为假如你 git commit 之后还推送至远程仓库了,那么有些时候可能就无力回天了,还记得 git 是一个分布式版本控制系统吗?分布式哦!

你可能感兴趣的:(IT,git,IT)