牛小葵

牛气冲天 一举夺魁

  • 主页
  • JavaScript
  • 读书笔记
  • VUE
所有文章 关于我

牛小葵

牛气冲天 一举夺魁

  • 主页
  • JavaScript
  • 读书笔记
  • VUE

Git基础

2017-09-04

摘要:廖雪峰的官方网站学习 git 基础

1.自身信息

1
2
3
4
5
6
git config--global user.name "Your Name" // 姓名
git config--global user.email "email@example.com" // 邮箱
cat ~/.gitconfig / / 显示git配置信息
[user]
name = niuxiaokui
email = 1085777324@qq.com

2.创建仓库

1
2
3
4
5
6
7
mkdir xxx // 创建文件夹xxx
cd xxx // 进入xxx
pwd // 显示当前目录
// windows
/c/Users/Administrator/Desktop/git/xxx
// mac
/Users/niuxiaokui/Desktop/xxx

3.初始化仓库

1
2
3
4
5
git init // 初始化仓库,将这个目录变成Git可以管理的仓库
// windows
Initialized empty Git repository in C:/Users/Administrator/Desktop/git/xxx/.git/
// mac
Initialized empty Git repository in /Users/niuxiaokui/Desktop/xxx/.git/

此时会有一个.git的隐藏文件夹,可以使用ls -A命令显示出来

4.添加

1
2
3
4
echo "注意事项" >> README.md // 创建README.md
git add README.md // 将文件添加到仓库
git add README1.md README2.md README3.md // 添加多个文件
git add . // 将目录下的所有文件添加到仓库

5.提交

1
2
3
4
git commit -m "first commit" // 提交,-m后面是本次提交说明
[master (root-commit) b9ed83e] first commit
1 file changed, 1 insertion(+)
create mode 100644 README.md

6.查看状态

修改 README.md 文件为

1
2
注意事项
1.第一项

执行命令

1
2
3
4
5
6
7
8
9
git status // 显示当前目录下文件的状态
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: README.md

no changes added to commit (use "git add" and/or "git commit -a")

提示 README.md 被修改,但没有提交

1
2
3
4
5
6
7
8
git diff README.md // 显示该文件修改的详细信息
diff --git a/README.md b/README.md
index 3814b35..15315c2 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
注意事项
+1.第一项

有时候还会有这样的信息warning: LF will be replaced by CRLF in README.md.
执行git config --global core.autocrlf false可以取消该警告,详细看CRLF 和 LF
此时执行cat ~/.gitconfig显示

1
2
3
4
5
[user]
name = niuxiaokui
email = 1085777324@qq.com
[core]
autocrlf = false

7.提交修改

再次执行git add README.md将文件提交到缓存区
查看此时状态git status

1
2
3
4
5
6
7
8
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: README.md
git commit -m "Add the first item" // 提交
[master b94706b] Add the first item
1 file changed, 1 insertion(+)

一定要记住:只有 add 之后的修改才能被 commit,在执行 commit 之前的操作一定是 add
再次查看状态git status

1
2
On branch master
nothing to commit, working tree clean

8.查看历史记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
git log // 显示从最近到最远提交的历史记录
Author: xxx <xxx@xxx.com>
Date: Mon Sep 4 14:34:46 2017 +0800

Add the first item

commit b9ed83e7f0ced27d8dd940e076b373d6e090fac3
Author: xxx <xxx@xxx.com>
Date: Mon Sep 4 14:10:06 2017 +0800

first commit

git log --pretty=oneline // 只显示commit id(版本号)与说明
b94706b9bdddbb0090ff0630e5c611cfffe13e5a (HEAD -> master) Add the first item
b9ed83e7f0ced27d8dd940e076b373d6e090fac3 first commit

git log --pretty=oneline --abbrev-commit // 简写
b94706b Add the first item
b9ed83e first commit

9.版本回退

1
2
3
4
git reset --hard HEAD^ // 回退到上个版本
git reset --hard HEAD^^ // 回退到上上个版本
git reset --hard HEAD~100 // 回退到上100个版本
git reset --hard b94706b9b // 根据版本号(可以不完整)回退到某个版本

10.记录每次命令

1
2
3
4
5
6
git reflog // 显示执行命令的历史及对应的版本号
b94706b (HEAD -> master) HEAD@{0}: reset: moving to b94706b9bd
b9ed83e HEAD@{1}: reset: moving to b9ed83e7f
b9ed83e HEAD@{2}: reset: moving to HEAD^
b94706b (HEAD -> master) HEAD@{3}: commit: Add the first item
b9ed83e HEAD@{4}: commit (initial): first commit

再次执行git reset --hard b9ed83e即可回退到对应版本

11.工作区(Working Directory)

作区就是平时工作修改代码的区域(xxx 目录),但不包含.git

12.版本库(Repository)

.git目录是 Git 的版本库,它里面有称为 stage(或者叫 index)的暂存区、分支(主分支 master 自动创建)、指向 master 的一个指针 HEAD 和其他一些东西。
分两步将文件添加到 Git 版本库里: 1.git add实际上就是把文件修改添加到暂存区 stage 中 2.git commit就是把暂存区 stage 中的所有内容提交到当前分支,之后暂存区 stage 中就没有任何内容了
因此,commit 提交修改之前一定要 add 将修改保存到暂存区
blog11
untracked:未跟踪,此文件在文件夹中,但并没有加入 git 库,不参与版本控制。 通过git add,git commit可将它置入跟踪库

unmodify:文件已经库中,未修改,即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两个去处,如果它被修改,而成为 modified。如果使用git rm移出版本库,则成为 untracked 文件

modified:文件已修改,仅仅是修改,并没有进行其它操作。这个文件也有两个去处,通过 git add 可进入暂存(staged)状态,使用git checkout则丢弃修改,返因到 unmodify 状态。这个 checkout 很好理解,就是取出库中文件,覆盖当前文件

staged:暂存状态。执得git commit则将修改同步到库中,这时库中的文件与本地文件又一致了,于是文件是 unmodify 状态。执行git reset HEAD filenam取消暂存,文件状态变为 modified

13.撤销修改

撤销文件在工作区的修改:

1
git checkout -- README.md

取消本次 add 操作,把暂存区的修改回退到工作区。HEAD表示最新的版本

1
git reset HEAD README.md

14.删除文件

删除也是一个修改操作,可以直接在文件管理器中删除文件,也可以使用命令删除

1
2
3
4
5
6
7
8
9
rm README.md // 删除工作区的文件
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

deleted: README.md

no changes added to commit (use "git add" and/or "git commit -a")

如果确定删除,可以使用 add 将删除操作保存到暂存区后再 commit 到版本库;如果想取消工作区的删除,可以使用git checkout -- README.md来恢复文件

1
2
git rm README.md // 删除工作区和暂存区的文件
rm 'README.md'

如果想要撤销删除,可以使用git checkout -- README.md回退到上次 commit 时的状态,但是上次 commit 之后修改的内容会丢失;如果确认删除,可以提交到版本库生成新版本

1
2
3
4
git commit -m 'remove README.md'
[master f5c8ca6] remove README.md
1 file changed, 2 deletions(-)
delete mode 100644 README.md

15.远程仓库

连接 github 步骤: 1.创建 SSH Key。git 下执行

1
ssh-keygen -t rsa -C "xxx@xxx.com" // 填自己的邮箱

然后一路回车,就可以在用户主目录里找到.ssh目录,里面id_rsa是私钥不可以告诉别人,id_rsa.pub是公钥 2.登录 github,点击右上角头像,选择Settings。进入新页面后,选择左侧列表SSH and GPG keys,再点击New SSH key按钮。接着随意填写 Title,再将id_rsa.pub中的内容复制粘贴到 Key,最后点击Add SSH key即可 3.创建远程仓库(名字叫 test,其他默认配置)后关联仓库,执行命令

1
2
git remote add origin git@github.com:xxx/test.git // 关联远程仓库,空仓库中有相关命令提示,xxx是自己的账户名
git push -u origin master // 将本地仓库master分支中的文件推送到远程仓库master分支中

第一次推送时使用-u 指定了当前主机为默认主机(如果当前分支与多个主机存在追踪关系,使用-u 选项则会指定一个默认主机),这样后面就可以不加任何参数推送

1
git push origin master

16.从远程库克隆

将自己远程库 test 中的所有文件克隆到本地,一般先要复制远程库地址

1
git clone git@github.com:xxx/test.git // xxx是自己的账户名

17.创建分支

git 分支创建与合并的原理:创建与合并分支,图文详细明了
创建分支,第一种方法

1
2
3
git branch test // 创建test分支
git checkout test // 切换到test分支
Switched to branch 'test'

第二种方法

1
2
git checkout -b test // 相当于创建并切换到test分支
Switched to a new branch 'test'

查看分支

1
2
3
git branch
master
* test

*表示当前所在分支

18.合并分支

将 test 分支合并到 master 主分支:先切换到 master 分支再合并

1
2
git checkout master // 切换到master分支
git merge test // 将test分支合并到当前分支

成功后会显示一些提示信息

1
2
3
Updating 82dfe5a..4dc62d7
Fast-forward // 快进模式
xxx...

19.删除分支

已经合并过的分支需要删除

1
2
git branch -d test // 合并后删除
Deleted branch test (was 4dc62d7).

如果要删除一个没有被合并过的分支

1
git branch -D test // 强行删除

20.处理冲突

git status可以告诉我们发生冲突的文件,发生冲突的文件会用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。手动修改这些冲突后重新走一遍代码提交流程就好了:add、commit、push,这样就提交到了远程库

21.分支策略

1、master 主分支应该是非常稳定的,仅用来发布新版本
2、平时都合并到 dev 开发分支,确定没问题后合并到 master 分支。比如我的代码都在 test 分支上,我先合并到 dev 分支,看到没问题,而且其他小伙伴们的代码合并到 dev 分支后也都没问题,此时就可以将 dev 分支合并到 master 分支上发布了
3、git 通常会使用 Fast forward 模式合并分支,但删除分支后,会丢掉分支信息。使用--no-ff禁用 Fast forward 模式,会在 merge 时生成一个新的 commit,从分支历史上就可以看出分支信息。

1
git merge --no-ff -m "merge with no-ff" test

4、git 提供了一个 stash 功能,可以把当前工作现场“储藏”起来,以便进行更紧急的任务(修复 bug 等)。处理完紧急任务后,还可以恢复现场继续工作

1
git stash // 储藏当前环境

完成紧急任务后,恢复原来工作现场

1
2
3
git stash list // 查看stash列表
git stash apply // 恢复工作环境,stash内容不会删除,相当于复制
git stash pop // 恢复工作环境,stash内容会删除,相当于剪切

可以多次 stash,恢复时先查看 stash 列表,再指定版本即可,不指定就是默认版本号为 0 的那个

1
2
git stash apply stash@{0}
git stash pop stash@{0}

如果 stash 列表都不需要了,可以清除 stash

1
git stash clear // 清除stash

22.查看远程库信息

从远程仓库克隆时,git 自动把本地的 master 分支和远程的 master 分支对应起来,远程仓库的默认名称是 origin

1
2
git remote
origin

显示更详细的信息

1
2
3
git remote -v
origin git@github.com:niuxiaokui/test.git (fetch)
origin git@github.com:niuxiaokui/test.git (push)

23.推送分支

master 分支是主分支,因此要时刻与远程同步;dev 分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步

1
2
git push origin master // 推送master主分支
git push origin dev // 推送dev分支

24.抓取分支

要在 dev 分支上开发,就必须创建远程 origin 的 dev 分支到本地

1
git checkout -b dev origin/dev

25.远程库冲突

当推送到远程库 dev 分支的提交有冲突时,先指定本地 dev 分支与远程 origin/dev 分支的链接,再用git pull把最新的提交从 origin/dev 抓下来,然后在本地合并,手动解决冲突,提交后再 push

1
2
git branch --set-upstream dev origin/dev
git pull

手动解决冲突,解决的方法和分支管理中的解决冲突完全一样

1
2
git commit -m "dev conflict"
git push origin dev

26.多人协作

1.用 git push origin branch-name 推送自己的修改 2.如果推送失败,用 git pull 试图合并,如果提示“no tracking information”,用命令git branch --set-upstream branch-name origin/branch-name建立链接关系 3.如果合并有冲突,则解决冲突,并在本地提交 4.最后用 git push origin branch-name 推送

27.创建标签

tag 就是一个让人容易记住的有意义的名字,它跟某个 commit 绑在一起

1
2
3
4
5
6
7
git checkout master // 切换到需要打标签的分支上
git tag v1.0 // 打一个新标签,默认打在最新提交的commit上
git tag v0.9 6224937 // 给某个版本打标签
git tag -a v0.1 -m "version 0.1" b9ed83e // 给某个版本创建带有说明的标签
git tag -s v0.2 -m "version 0.2" b94706b // 采用PGP签名一个标签
git tag // 查看所有标签
git show v0.9 // 查看标签v0.9的信息

28.操作标签

标签未推送到远程

1
2
3
git tag -d v0.1 // 删除本地标签
git push origin v1.0 // 推送某个标签到远程
git push origin --tags 一次性推送全部尚未推送到远程的本地标签

标签已推送到远程,本地、远程都要删除标签

1
2
git tag -d v0.9 // 删除本地标签
git push origin :refs/tags/v0.9 // 删除远程标签

29.使用 GITHUB

现将开源项目 fork 到自己的库,然后从自己 fork 的库 clone 一份到本地。修改完后推送到自己的库,在 GitHub 上发起一个 pull request 来贡献代码

30.使用码云

在码云上注册账号并登录后,选择右上角用户头像 -> 菜单“设置”,然后选择左侧列表里的“SSH 公钥”,填写标题,将用户主目录下的.ssh/id_rsa.pub 文件的内容粘贴上。码云可以创建私有仓库,并且不超过 5 人的小团队可以免费使用多项服务

31.关联远程库

git remote和git remote -v可以查看远程库信息(一般默认远程库是 origin)

1
2
3
git remote rm origin // 删除已关联的名为origin的远程库
git remote add gitee git@gitee.com:niuxiaokui/test.git // 关联码云的远程库gitee
git remote add github git@github.com:niuxiaokui/test.git // 关联github的远程库github

一个本地库关联多个远程库

1
2
git push gitee master // 推送到码云的master分支
git push github master // 推送到github的master分支

32.醒目颜色

让 Git 显示颜色,会让命令输出看起来更醒目

1
git config --global color.ui true

33.忽略文件

配置.gitignore文件忽略那些不想提交的文件,原则是:忽略操作系统自动生成的文件;忽略编译生成的中间文件、可执行文件等;忽略你自己的带有敏感信息的配置文件
最后将.gitignore文件也提交到 git,并且可以对.gitignore做版本管理
如果想要强制添加.gitignore文件忽略的文件,可以使用-f。如果.gitignore文件写的有问题,也可以查看配置出现问题的位置

1
2
git add -f test.txt // 强制添加文件
git check-ignore -v test.txt // 查看忽略文件test.txt规则的位置

34.配置别名

使用--global全局参数可以让这些命令在这台电脑的所有 Git 仓库都生效,用户全局的 Git 配置文件放在用户主目录下的一个隐藏文件.gitconfig中;不使用--global则只在当前仓库生效,每个仓库的 Git 配置文件都放在.git/config 文件中。如果想修改 git 的配置,可以直接修改这些文件

1
2
3
4
git config --global alias.st status // 告诉git'st'表示'status'
git st // 相当于git status
git config --global alias.unstage 'reset HEAD'
git unstage test.txt // 相当于git reset HEAD test.txt
  • 工具
模拟实现call、applay、bind和new
浏览器渲染页面与加载资源
© 2023 牛小葵
Hexo Theme Yilia by Litten
  • 所有文章
  • 关于我

tag:

  • CSS
  • JavaScript
  • Flex
  • 工具
  • HTML
  • JSON
  • 浏览器
  • node
  • MongoDB
  • Vue
  • 笔记
  • 正则
  • 数据结构与算法
  • underscore
  • 小程序
  • 压缩
  • 总结
  • 目标
  • 设计模式
  • HTTP
  • 【安全】
  • Chrome

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

持续学习