Git

148 阅读17分钟

image.png

生成远程仓库

码云都是中文,所以这里截图没有必要,相信会中文看我的描述也都能 ok,其实很简单,小白不要慌,大神请转身。

  1. 登陆gitee.comopen in new window
  2. 右上角头像左边有个  “+”  鼠标放上去点击  "创建仓库"
  3. 然后必填项就是  "仓库名称""路径"
  4. 如果你的仓库需要让别人合作,或开源,可以选择  "公开"
  5. 最后点击创建

连接远程仓库并初始提交代码

然后我们会看到一个教程页面,因为此时仓库是空的,没有代码,才有这个页面,这里简单说说 Git 全局设置和创建 git 仓库这两步都是指你在电脑上操作本地仓库的步骤,我们已经做了,忽略就好了

image.png

解读

  • git remote add ... 这句命令是把远程仓库地址添加到本地仓库中,建立连接
  • git push -u origin master 这句命令只是在第一次代码提交用的 初始化语句 之后在提交代码到远程仓库,就可以直接写 git push 就好了,默认提交到的就是 master 地址;

如果你远程仓库里还有多个分支,【master 分支是仓库里的主分支,也是默认分支】,需要提交到其他分支就这样写: git push origin other “other” 就是其他分支的名字,也不需要加 -u

拉取代码

image.png

踩坑

针对小白的踩坑提醒:

  1. 每一次提交 git push 的时候,确保本地仓库代码已经 git commit -m '先存到本地仓库后才能上传远程仓库'
  2. 如果是和别人一起开发,每次提交前需要先把代码提交本地仓库,然后拉取远程 git pull,然后看看有没有代码冲突,没有冲突,再 git push 到远程
  3. git 运行操作流程
  • 首先 git add -A 将我们修改的文件,无论新值文件还是删除,还是写了代码,统统放到暂存区,为什么要有暂存区呢,就是为了防止你后悔了,如果你写完发现有错误,不想要了,这时候可以从暂存区撤回之前没改动过的代码。命令是 git checkout 文件名.后缀
  • 然后 git commit -m '写一句你日后看到就能会想起这次提交了什么玩意儿的语句,一定要好好写,给自己方便用的' 这时候才是真的把暂存区的代码存如到了本地仓库,当然你要是突然后悔了怎么办?还有命令可以撤回的,这里不说了,可以看我的命令大全
  • 如果仓库就自己在维护,那么直接 git push 提交代码就行了,如果是和别人在一起维护仓库,那么别人可能也提交代码了,你就需要先 git pull 把远程仓库最新代码拉下来,git 会帮我们合并代码的,然后再用 git push 提交上去就 OK 了!

#在公司里用 git

  • 打开电脑,先 git pull 把远程代码更新一遍到本地,万一有其他同事昨天加班提交的代码呢

  • 开始写代码

  • git add -A

  • git commit -m '今天我解决了去年的一个 bug,我感觉超厉害'

  • git pull

    • 永远记住,你不是一个人在开发,所以拉代码很重要,不然容易产生代码冲突,可能会导致所有人代码出错。
  • git push

命令大全

#git rebase -i 合并提交|版本归滚open in new window

#git checkout -b devName 创建分支

#git checkout devName 切换分支

#git branch 查看分支

#git branch -v 查看远程仓库地址

#git branch -d devName 删除本地分支

#git branch -r -d origin/branch-name 删除连接的远程本地分支

#git push origin :branch-name 删除远程分支

#git push -d origin branch-name 同时删除本地和远程分支

#git push --set-upstream origin branch-name 强制推送本地分支到线上【第一次】

#git pull 获取服务器最新

#git add -A 添加到暂存区

#git commit -m "日志信息" 提交到本地仓库

#git merge dev1 dev2 合并分支

#解决冲突

  • git fetch origin master:tmp
  • git diff tmp
  • git merge tmp

#参考

时间有限,git 常用的命令其实就那几个,一般情况下再公司里用的都是 git 图像化软件操作,命令不是很常用,但是作为入门还是要经常写写命令。 git 命令大全open in new window来自 GitHub 的网友 git 入门教程

git 怎么删除某一次提交?

这只是回退代码的一种手段,实际上并没有真的删掉,只是删掉了 commitid,实际上还存在库里 原文open in new window觉得很有用的所以写在前面

问题【很实战的问题】:

我在本地的版本库一共提交了 3 次,分别为 A-B-C,如果我发现提交 B 是不必要,想要删除 B。已达到 A-C 这样的过程,具体应该怎么实现呢?
如果在远程版本库中,多人协作的情况下:
有两个工作人员 A,B,分别提交了 2 次,整个分支情况为 A1-B1-A2-B2,如果我要删除 B1,又该怎么实现所有本地和远程版本库都为 A1-A2-B2 呢?

答案【很有价值的答案】

  1. 像 A-B-C 这种比较简单的历史,要去掉 B 的话可以这样

    git reset --hard A git cherry-pick C

    • 结果:回退到 A 上然后把 C 再 cherrypick 过来,这样就把 B 给跳过了。

    • 如果待处理的提交历史比较长,那用 rebase -i 更方便一些

      git rebase -i A

    • 这个命令以 A 为新的基准(base),将 A 之后的 commit 列出来让用户选择如何处理。在出现的编辑界面上,把 B 前面的 pick 改成 d 或者 drop,或者把一整行删除掉,保存退出就可以了。

  2. 同样地,处理 A1-B1-A2-B2,要删除 B1 的话

    • git reset --hard A1

    • git cherry-pick A2 B2

    • 或者

      git rebase -i A1

    • 把 B1 从编辑列表里删掉,保存退出。

  3. 最后

    第一个例子和第二个例子有个不同的地方:
    第一个例子里的 commit 都是本地还没推送的,这种可以随意整,整好了以后再推送,不会影响别人。
    第二个例子里,commit 很可能都是已经推送到大家共用的中央仓库的,B1 很可能已经被拉取到了其他人的本地仓库里。
    你这边将其删除后,需要用强制推送更新中央仓库里的分支,并且通知其他人这个变动,否则其他人很可能会将新旧版本的分支历史不经意间 merge 到一起再推送回中央仓库,导致 B1 没删掉还多了一个 merge commit,将分支历史变得更加复杂了。

  4. 后记 如果 push 的时候发生了错误,可以使用 force push 强制推送

#删除库内大体积文件

查看本地仓库文件大小命令:git count-objects -v -H GitHub 和 gitee 在仓库存储上有体积限制,比如超过 1G 就不可以往库里体积代码了。那么我们有时候可能会误操作,将大文件存到了库里。于是我们觉得把大文件删掉再 push 一次不就没有了吗?

no,不是这样的,我们每次体积的代码和文件都会存到.git 文件夹里,被加密存储,即便我们删掉了本次的大文件,但是它再历史版本中还是存在。

那怎么办?有两种办法:

#1. 重新建立仓库,快速省事,把当前文件存进去

这样的好处是快速,简单,坏处是以前的历史记录都没了。。。

还有就是创建临时分支,把当前的文件都提交进去,再把 master 分支删掉,再删掉远程 master,然后本地将临时分支合并到 master,删掉临时分支后再提交到远程,比较麻烦,不如上面那个粗暴简单

#【核心科技】用一个黑科技删除

先摘点这个插件的官话 官网open in new window

像 git-filter-branch 一样删除大型或麻烦的 blob,但速度更快。并用 Scala 编写

#git-filter-branch 的替代品

我们 git 其实有 git-filter-branch 来删除版本中文件的,就是操作起来太繁琐。于是有人写了这个,其实也是扩展的 git-filter-branch 功能,很强大,很好用。

BFG 是一种更简单,更快速的替代方法,可 git-filter-branch 用于从 Git 存储库历史记录中清除不良数据:

  • 删除疯狂的大文件
  • 删除密码,凭据和其他私人数据

#git 最新版应该是内置了该插件,所以我用下面命令,直接就删掉了大文件

![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/68456f7224ad4917bc69d108dcf53046~tplv-k3u1fbpfcp-watermark.image?)
## 删掉连接的远程地址,重新绑定新远程地址
  1. 首先git remote -v查看有哪些远程地址

我这里显示

image.png 2. 删除 myGiteeBlog 地址:git remote rm myGiteeBlog 2. 再查看还有没有连接:git remote -v 干净了 2. 连接一个新的地址:git remote add origin git@gitee.com:这里是你的新地址,地址中 origin 可以是你起的任意的名字哦 2. 设置要推送的远端分支:git push --set-upstream origin master


还有一个方法就是查看电脑隐藏文件,找到项目里的.git 文件夹里的 config 文件,记事本打开后修改地址

image.png

最快的设置方式:git remote set-url origin git@gitee.com

1. 关于 Vim

它是 Linux 的一款编辑器,由于 git 内置的编辑器也是 vim 所以我不得不总结一下它的使用。

#1.1 Vim 的几种模式

  • 正常模式:可以使用快捷键命令,或按:输入命令行。
  • 插入模式:可以输入文本,在正常模式下,按 i、a、o 等都可以进入插入模式。
  • 可视模式:正常模式下按 v 可以进入可视模式, 在可视模式下,移动光标可以选择文本。按 V 进入可视行模式, 总是整行整行的选中。ctrl+v 进入可视块模式。
  • 替换模式:正常模式下,按 R 进入。

#2. 启动 Vim

注意,如果电脑上没有安装 Vim,下面的命令不生效

  • vim -c cmd file: 在打开文件前,先执行指定的命令;
  • vim -r file: 恢复上次异常退出的文件;
  • vim -R file: 以只读的方式打开文件,但可以强制保存;
  • vim -M file: 以只读的方式打开文件,不可以强制保存;
  • vim -y num file: 将编辑窗口的大小设为 num 行;
  • vim + file: 从文件的末尾开始;
  • vim +num file: 从第 num 行开始;
  • vim +/string file: 打开 file,并将光标停留在第一个找到的 string 上。
  • vim –remote file: 用已有的 vim 进程打开指定的文件。 如果你不想启用多个 vim 会话,这个很有用。但要注意, 如果你用 vim,会寻找名叫 VIM 的服务器;如果你已经有一个 gvim 在运行了, 你可以用 gvim –remote file 在已有的 gvim 中打开文件。

#3. 文档操作

这里的命令对 git 内置的 vim 是生效的

  • :e file – 关闭当前编辑的文件,并开启新的文件。 如果对当前文件的修改未保存,vi 会警告。

  • :e! file – 放弃对当前文件的修改,编辑新的文件。

  • :e+file – 开始新的文件,并从文件尾开始编辑。

  • :e+n file – 开始新的文件,并从第 n 行开始编辑。

  • :enew – 编译一个未命名的新文档。(CTRL-W n)

  • :e – 重新加载当前文档。

  • :e! – 重新加载当前文档,并丢弃已做的改动。

  • :e#或 ctrl+^ – 回到刚才编辑的文件,很实用。

  • :f 或 ctrl+g – 显示文档名,是否修改,和光标位置。

  • :f filename – 改变编辑的文件名,这时再保存相当于另存为。

  • gf – 打开以光标所在字符串为文件名的文件。

  • :w – 保存修改。

  • :n1,n2w filename – 选择性保存从某 n1 行到另 n2 行的内容。

  • :wq – 保存并退出。

  • :q! - 不保存退出

  • ZZ – 保存并退出。

  • :x – 保存并退出。

  • :q[uit] ——退出当前窗口。(CTRL-W q 或 CTRL-W CTRL-Q)

  • :saveas newfilename – 另存为

  • :browse e – 会打开一个文件浏览器让你选择要编辑的文件。 如果是终端中,则会打开 netrw 的文件浏览窗口; 如果是 gvim,则会打开一个图形界面的浏览窗口。 实际上- - :browse 后可以跟任何编辑文档的命令,如 sp 等。 用 browse 打开的起始目录可以由 browsedir 来设置:

    • :set browsedir=last – 用上次访问过的目录(默认);
    • :set browsedir=buffer – 用当前文件所在目录;
    • :set browsedir=current – 用当前工作目录;
  • :Sex – 水平分割一个窗口,浏览文件系统;

  • :Vex – 垂直分割一个窗口,浏览文件系统;

#4. 光标的移动

#4.1 基本移动

以下移动都是在 normal 模式下。

  • h 或退格: 左移一个字符;
  • l 或空格: 右移一个字符;
  • j: 下移一行;
  • k: 上移一行;
  • gj: 移动到一段内的下一行;
  • gk: 移动到一段内的上一行;
  • +或 Enter: 把光标移至下一行第一个非空白字符。
  • -: 把光标移至上一行第一个非空白字符。
  • w: 前移一个单词,光标停在下一个单词开头;
  • W: 移动下一个单词开头,但忽略一些标点;
  • e: 前移一个单词,光标停在下一个单词末尾;
  • E: 移动到下一个单词末尾,如果词尾有标点,则移动到标点;
  • b: 后移一个单词,光标停在上一个单词开头;
  • B: 移动到上一个单词开头,忽略一些标点;
  • ge: 后移一个单词,光标停在上一个单词末尾;
  • gE: 同 ge ,不过‘单词’包含单词相邻的标点。
  • (: 前移 1 句。
  • ): 后移 1 句。
  • {: 前移 1 段。
  • }: 后移 1 段。
  • fc: 把光标移到同一行的下一个 c 字符处
  • Fc: 把光标移到同一行的上一个 c 字符处
  • tc: 把光标移到同一行的下一个 c 字符前
  • Tc: 把光标移到同一行的上一个 c 字符后
  • ;: 配合 f & t 使用,重复一次
  • ,: 配合 f & t 使用,反向重复一次 上面的操作都可以配合 n 使用,比如在正常模式(下面会讲到)下输入 3h, 则光标向左移动 3 个字符。
  • 0: 移动到行首。
  • g0: 移到光标所在屏幕行行首。
  • ^: 移动到本行第一个非空白字符。
  • g^: 同 ^ ,但是移动到当前屏幕行第一个非空字符处。
  • : 移动光标所在屏幕行行尾。
  • n|: 把光标移到递 n 列上。
  • nG: 到文件第 n 行。
  • :n<cr> 移动到第 n 行。
  • 😒<cr> 移动到最后一行。
  • H: 把光标移到屏幕最顶端一行。
  • M: 把光标移到屏幕中间一行。
  • L: 把光标移到屏幕最底端一行。
  • gg: 到文件头部。
  • G: 到文件尾部。

#4.2 翻屏

  • ctrl+f: 下翻一屏。
  • ctrl+b: 上翻一屏。
  • ctrl+d: 下翻半屏。
  • ctrl+u: 上翻半屏。
  • ctrl+e: 向下滚动一行。
  • ctrl+y: 向上滚动一行。
  • n%: 到文件 n%的位置。
  • zz: 将当前行移动到屏幕中央。
  • zt: 将当前行移动到屏幕顶端。
  • zb: 将当前行移动到屏幕底端。

#4.3 标记

**使用标记可以快速移动。到达标记后,可以用 Ctrl+o 返回原来的位置。 Ctrl+o 和 Ctrl+i 很像浏览器上的 后退 和 前进 **

  • m{a-z}: 标记光标所在位置,局部标记,只用于当前文件。
  • m{A-Z}: 标记光标所在位置,全局标记。标记之后,退出 Vim, 重新启动,标记仍然有效。
  • `{a-z}: 移动到标记位置。
  • ‘{a-z}: 移动到标记行的行首。
  • `{0-9}:回到上[2-10]次关闭 vim 时最后离开的位置。
  • “: 移动到上次编辑的位置。”也可以,不过“精确到列,而”精确到行 。如果想跳转到更老的位置,可以按 C-o,跳转到更新的位置用 C-i。
  • `”: 移动到上次离开的地方。
  • `.: 移动到最后改动的地方。
  • :marks 显示所有标记。
  • :delmarks a b – 删除标记 a 和 b。
  • :delmarks a-c – 删除标记 a、b 和 c。
  • :delmarks a c-f – 删除标记 a、c、d、e、f。
  • :delmarks! – 删除当前缓冲区的所有标记。
  • :help mark-motions 查看更多关于 mark 的知识。

#5. 插入文本【重要】

#5.1 基本插入

  • i: 在光标前插入;一个小技巧:按 8,再按 i,进入插入模式,输入=, 按 esc 进入命令模式,就会出现 8 个=。 这在插入分割线时非常有用,如 30i+<esc>就插入了 36 个+组成的分割线。
  • I: 在当前行第一个非空字符前插入;
  • gI: 在当前行第一列插入;
  • a: 在光标后插入;
  • A: 在当前行最后插入;
  • o: 在下面新建一行插入;
  • O: 在上面新建一行插入;
  • :r filename 在当前位置插入另一个文件的内容。
  • :[n]r filename 在第 n 行插入另一个文件的内容。
  • :r !date 在光标处插入当前日期与时间。同理,:r !command 可以将其它 shell 命令的输出插入当前文档。

#5.2 改写插入

  • c[n]w: 改写光标后 1(n)个词。
  • c[n]l: 改写光标后 n 个字母。
  • c[n]h: 改写光标前 n 个字母。
  • [n]cc: 修改当前[n]行。
  • [n]s: 以输入的文本替代光标之后 1(n)个字符,相当于 c[n]l。
  • [n]S: 删除指定数目的行,并以所输入文本代替之。 注意,类似 cnw,dnw,ynw 的形式同样可以写为 ncw,ndw,nyw。

#6. 剪切复制和寄存器

#6.1 剪切和复制、粘贴

  • [n]x: 剪切光标右边 n 个字符,相当于 d[n]l。
  • [n]X: 剪切光标左边 n 个字符,相当于 d[n]h。
  • y: 复制在可视模式下选中的文本。
  • yy or Y: 复制整行文本。
  • y[n]w: 复制一(n)个词。
  • y[n]l: 复制光标右边 1(n)个字符。
  • y[n]h: 复制光标左边 1(n)个字符。
  • yor D: 删除(剪切)当前位置到行尾的内容。
  • d[n]w: 删除(剪切)1(n)个单词
  • d[n]l: 删除(剪切)光标右边 1(n)个字符。
  • d[n]h: 删除(剪切)光标左边 1(n)个字符。
  • d0: 删除(剪切)当前位置到行首的内容
  • [n] dd: 删除(剪切)1(n)行。
  • :m,nd<cr> 剪切 m 行到 n 行的内容。
  • d1G 或 dgg: 剪切光标以上的所有行。
  • dG: 剪切光标以下的所有行。
  • daw 和 das:剪切一个词和剪切一个句子,即使光标不在词首和句首也没关系。
  • d/f<cr>:这是一个比较高级的组合命令,它将删除当前位置 到下一个 f 之间的内容。
  • p: 在光标之后粘贴。
  • P: 在光标之前粘贴。

#6.2 文本对象

  • aw:一个词
  • as:一句。
  • ap:一段。
  • ab:一块(包含在圆括号中的)。 y, d, c, v 都可以跟文本对象。

#6.3 寄存器

  • a-z:都可以用作寄存器名。”ayy 把当前行的内容放入 a 寄存器。
  • A-Z:用大写字母索引寄存器,可以在寄存器中追加内容。 如”Ayy 把当前行的内容追加到 a 寄存器中。
  • :reg 显示所有寄存器的内容。
  • “”:不加寄存器索引时,默认使用的寄存器。
  • “*:当前选择缓冲区,”*yy 把当前行的内容放入当前选择缓冲区。
  • “+:系统剪贴板。”+yy 把当前行的内容放入系统剪贴板。

配置 git 自动提交代码

  1. 创建一个以.sh 结尾的文件,里边写上以下代码:

image.png

  1. 在 package.json 文件里的 scripts 下添加一行代码如下

    "push": "bash deploy.sh"

  2. 完了。