Git 使用笔记

1. 安装

安装完成后,需要一步设置,在命令行中输入:

git config --global user.name "name"

git config --global user.email "email@e.com"

如果使用了 git config 命令的 --global 参数,则这台机器上的所有 Git 仓库都会使用这个配置,可以单独对某个特定的仓库设定不同的用户名和邮箱地址。

2. 创建版本库

在需要的目录下使用

git init 命令

为避免出现问题,包括根目录在内的多级目录名都不要使用中文。

使用上述命令后,会创建一个空的仓库,并且目录下会多出一个 .git 目录,这个目录是 Git 用来跟踪管理版本库的。

3. 添加,提交,查看状态,对比不同

git add
告诉 Git ,把文件添加到仓库

git commit
把文件提交到仓库

git commit -m "first commit"
把文件提交到仓库,并添加说明

git status
查看当前仓库的状态

git diff
查看 difference ,可以看出做了什么修改

4. 版本回退

git log
显示从最近到最远的提交日志

git log --pretty=oneline
用于显示提交日志,避免太多内容,简洁显示

git reset --hard HEAD^
用于版本回退,上一个版本就是 HEAD^,上上个版本就是 HEAD^^,往前一百个版本则可以写成 HEAD~100

git reset --hard 1094a
版本回退至指定 ID 的版本

git reflog
用来记录你的每一次命令

5. 工作区和暂存区

工作区:就是我们电脑中看到的目录
版本库:工作区中存在的 .git 目录,则是 Git 的版本库,版本库中最重要的就是 stage(或者叫 index) 的==暂存区==

image

git diff HEAD --readme.txt
可以查看工作区和版本库里面最新版本的区别

每次提交,需要先将修改 add 到暂存区,然后再 commit 到版本库

6. 撤销修改

git checkout -- file
可以丢弃工作区的修改,此时分两种情况:

第一种:此文件自修改后还没放到暂存区,撤销修改则回到和版本库一模一样的状态;

第二种:此文件已经添加到暂存区后又发生了修改,则撤销修改回到添加暂存区后的状态。

总结:就是让这个文件恢复到上一次 commit 或 add 的状态。

git reset HEAD file
可以把暂存区的修改撤销掉,重新放回工作区

7. 删除文件

如果你工作区中删除了某个文件,则工作区就和版本库不同了,通过 git status 则可以查看哪些文件被删除了,此时你有两个选择:

第一:如果你确实要在版本库中删除这个文件,那就用命令 git rm 删掉,并且 git commit

第二:如果是误删,则可以丢弃工作区的修改,使用 git checkout -- file 将误删的文件恢复

8. 远程仓库

本地 Git 仓库和 GitHub 仓库之前传输可以通过 SSH 加密进行。则需要一些设置:

第一步:创建 SSH Key。 在用户目录下,看看有没有 .ssh 目录,如果有,则看此目录下有没有 id_rsa 和 id_rsa.pub 这两个文件,如果有,则跳到下一步。如果没有,则打开 Shell(Windows 下打开 Git Bash),创建 SSH Key:

ssh-keygen -t rsa -C "email"

然后一直回车就可以了,顺利的话,则可以在用户目录下看到 .ssh 目录,并且有 id_rsa 私钥和 id_rsa.pub 公钥

第二步:登录 GitHub ,打开 “Account settings”,“SSH Keys”页面:然后点击“Add SSH Key”,填上任意 Title,在 Key 文本框里黏贴 id_rsa.pub 文件的内容,点击 “Add Key”即可看到添加的 Key

假如你有多台电脑,则可以将你每台电脑的公钥添加到 GitHub 上,则就可以在每台电脑上进行推送了。

关联远程库,使用,命令:

git remote add origin git@server-name:path/repo-name.git

第一次推送本地库到远程库的时候,由于远程库是空的,则用

git push -u origin master

在第一次推送的时候,Git 不但会把本地的 master 分支推送到远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取的时候,就可以简化命令了。
git push origin master 即可

git clone
克隆远程仓库

9. 分支管理

  1. 如果一开始的时候,只有 master 一条分支,则 master 指向最新的提交,而 HEAD 则指向 master,这样就确定了当前的分支以及当前的提交点。
    你每做一次提交,master 分支就会向前移动一步,随着不断提交,master 分支的线会越来越长。

    image

  2. 如果此时我们创建一个分支 dev,则 Git 会创建一个指针 dev,指向 master 相同的提交,再把 HEAD 指向 dev,表明当前分支为
    image
  3. 如果在此基础上,你又做了一次提交,则 dev 指针向前移动一步,而 master 指针不变。


    image
  4. 如果在 dev 上开发结束了,则可以吧 dev 合并到 master 上,Git 上的合并,最直接的方法就是直接吧 master 指向 dev 的当前提交,即可完成合并。

image

如果将上述过程换成实际操作,则为:
创建 dev 分支
git checkout -b dev

注:git checkout 命令加上 -b 则表示创建并切换,相当于如下两条命令:
git branch dev
git checkout dev

使用 git branch 命令可以查看当前分支

在 dev 分支上做了修改之后,使用 add ,然后 commit 将修改提交到 dev 分支,
然后 git checkout master 切换到 master 分支,使用 git merge dev 将 dev 分支合并到 master 分支上。

如果使用完分支之后,想要删除分支,则可以使用 git branch -d dev 将 dev 分支删除。

10. 冲突解决

如果主分支 master 和 dev 分支同一文件都做了修改,然后合并 dev 分支的时候就会出现冲突,


image

解决冲突就是把 Git 合并失败的文件手动编辑为我们希望的内容,再提交。

用 git log --graph 命令可以看到分支合并图。

11. 分支管理策略

通常,合并分支时,如果可能,Git 会用 Fast forward 模式,但这种模式下,删除分支后,会丢掉分支信息。

如果要强制禁用 Fast forward 模式,Git 就会在 merge 的时候生成新的 commit,这样就可以从分支历史上看到分支信息。

git merge --no-ff -m "merge with no-ff" dev

实际开发中,我们应该遵循:

  1. master 分支应该是非常稳定的,也就是用来发布新版本的,平时不能在上面干活。
  2. 平时干活都在 dev 分支上,dev 分支是及其不稳定的,当需要发布的时候,把 dev 分支合并到 master 上,在 master 分支发布版本。
  3. 你和你的同事每个人都在 dev 上干活,每个人都有自己的分支,时不时往 dev 分支上合并就可以了。


    image

12. Bug 分支

如果你在分支 dev 上进行开发的时候,测试部门测试出 master 上有 bug,需要你立即修复一下,而你当前还在 dev 上开发,没有进行提交,因为工作只进行了一般,还没法提交,则此时就可以使用

git stash
将当前工作现场“储存”起来,等以后恢复现场继续工作。

此时你可以切换到 master 上,然后创建一个修复 bug 的临时分支,然后修复后,add 、commit 到临时分支上,然后在 master 上 merge 一下。

修复完 bug 后,你切换到 dev 分支上继续干活,你之前将内容“储存”起来了,你有两种方式可以将它恢复:

  1. 使用 git stash apply 恢复,但是恢复之后,stash 内容并不删除,你需要继续使用 git stash drop 来删除。
  2. 使用 git stash pop ,恢复的同时也可以把 stash 内容删除了。

使用 git stash list 可以查看目前所有的 stash 内容。

使用 git stash apply stash@{0} 可以恢复指定 stash 内容。、

如果要丢弃一个没有被合并过的分支,通过:
git branch -D name

13. 多人协作

远程仓库的默认名称是 origin
查看远程库的信息,可使用:
git remote 或者使用 git remote -v 显示更详细的信息。

推送分支:
git push origin master
推送其他分支
git push origin dev

并不是所有分支都要推送到远程仓库,如果选择呢?

  1. master 分支是主分支,因此要时刻与远程同步
  2. dev 分支是开发分支,所有的成员都要在上面进行工作,所以也需要与远程同步
  3. bug 分支只用于本地修复 bug,没必要推送到远程分支,除非有需要记录修复了多少个 bug
抓取分支

创建本地分支
git checkout -b dev origin/dev
本地分支和远程分支建立链接关系
git branch --set-upstream-to <branch-name> origin/<branch-name>

注:
多人协作工作模式:

  1. 首先,可以试图用 git push origin <branch-name> 推送到远程分支
  2. 如果推送失败,则因为远程仓库比你的本地仓库新,则需要先进行 git pull 进行合并
  3. 如果合并冲突,则解决冲突,并在本地提交
  4. 没有冲突或者解决完冲突后,在使用 git push origin <branch-name> 进行推送
  5. 如果 git pull 的时候提示 no tracking information,则说明本地分支和远程分支没有建立联系,则用命令 git branch --set-upstream-to <branch-name> origin/<branch-name>

14. 标签管理

Git 中打标签,切换到指定分支,执行:
git tag v1.0
使用 git tag 可以查看所有标签
git tag v0.9 f43434
可以对指定的 id 打 tag

git tag -a v0.1 -m "message" f3434
创建带有说明的标签 -a 指定标签名称
-m 指定说明信息

git tag -d v0.1 可以删除错误标签

git push origin v1.0 可以将指定的 tag 推送到远程仓库

git push origin --tags 可以将所有的 tag 一次性推送到远程仓库

git push origin :refs/tags/v0.9 可以将 tag 从远程删除

15. 一个本地库同时关联多个远程库

git remote rm origin
先删除已关联的名为 origin 的远程库

git remote add github git@github.com:keven/learn.git
关联 Github 的远程仓库

git remote add gitee git@gitee.com:keven/learn.git
关联码云的远程库

git push github master
git push gitee master
推送到远程

16. 自定义配置 Git

让 Git 命令显示颜色
git config --global color.ui true

忽略特殊文件
在 Git 目录下新建 .gitignore 文件,然后把需要忽略的文件添加进去即可。可以参考 GitHub 地址:https://github.com/github/gitignore

.gitignore 文件本身要放到版本库中,并且可以对 .gitignore 做版本管理。

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

推荐阅读更多精彩内容