本文内容是对廖雪峰老师Git教程做的笔记,外加一些自己的学习心得,还抱着学以致用的心态来实践一番

Git学习笔记

分布式版本控制与集中式版本控制的最大区别

$ git --help     //不知道怎么办就看帮助呗

Git简介

安装Git

下载并安装Git,安装完成后,还需要最后一步设置
Git Bash命令行输入:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址

创建版本库repository

  • 首先建一个空目录
$ mkdir learngit //当前目录下创建文件夹名为learngit
$ cd learngit //进入learngit文件夹目录下
$ pwd  //显示当前目录

pwd命令用于显示当前目录

  • 然后通过git init命令把这个目录变成Git可以管理的仓库
$ git init  //初始化
$ ls -ah //显示.git目录

ls -ah用于显示.git目录

把文件添加到版本库

编写一个readme.txt,放在learngit目录下(或者子目录)

$ vi readme.txt
Esc退出编辑,跳到命令模式
:w保存文件但不退出vi
:w file将修改另外保存到file中,不退出vi
:w!强制保存,不退出vi
:wq保存文件并退出vi
:q不保存文件,退出vi
:q!不保存文件,强制退出vi
:e!放弃所有修改,从上次保存文件开始再编辑

1.把文件添加到暂存区

使用git add file_name 或 git stage file_name

$ git add readme.txt

2.把文件提交到版本库

$ git commit -m "wrote a readme file" 

-m后面是本次提交的说明,一次可以提交多个文件
注意:git commit 指定文件的时候会直接提交工作区的文件,不指定文件的时候提交的是缓存区stage的所有文件

$ git commit readme.txt -m "balabala"

Git bash操作文件及文件夹命令

cd d:\Github切换d盘下面的Github目录
cd ..回退到上一个目录
cd回退到主目录
pwd显示当前目录路径
ls(ll)列出当前目录中的所有文件,ll更详细
ls(ll) -a列出当前目录中的所有文件包括隐藏目录
touch readme.md新建一个文件
rm readme.md删除一个文件
mkdir img新建一个文件夹img
rm -r img删除一个文件夹img
mv readme.md img把当前目录下的目标文件移动到一个指定目录,使用相对路径
reset清屏,清空git bash 命令窗口中的所有内容

查看Git安装目录

  • Windows

    • cmd where git
  • Mac
    • 命令行 which git

时光穿梭机

版本退回

git reset --hard commit_id
  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

    • Git的commit_d(版本号)是一个十六进制的用SHA1计算出来的数字
    • 在Git中用HEAD表示当前版本,上一个版本就是HEAD^,上一百个版本写成HEAD~100
    • 使用git reset --hard HEAD^命令退回上一个版本
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本
    • 使用git log --pretty=oneline让记录单行显示
    • 使用git loggit reflog 加file_name查看指定文件的历史
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
    • Git 提供一个命令git reflog来记录你的每一次命令,这样就可以找到所有版本的commit id

工作区和暂存区

  • 工作区(Working Directory)
    你在电脑里能看到的目录
  • 版本库(Repository)
    工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库.我们可以称它为Repo
    Repo里存放了很多东西,其中最重要的就是暂存区stage(或者叫index),还有Git为我们自动创建的第一个分支(Branch)master.以及指向master的一个指针叫HEAD.
    git从安装到应用的学习-LMLPHP
    cat file_name命令,其功能是显示在工作区、暂存区和分支里同名文档的最新修改版本的内容

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

掌握仓库当前的状态

$ git status

查看修改内容

下面是关于 git diff的一些使用区别
git从安装到应用的学习-LMLPHP
另外可以使用git diff commit_id_1 commit_id_2比较两个不同版本的区别

cat file_name命令,其功能是显示在工作区、暂存区和分支里同名文档的最新修改版本的内容

撤销修改

  • 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file_name

    • 可以用git checkout -- *丢弃所有工作区文件的修改
  • 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步
    • 第一步用命令git reset HEAD file_name就回到了场景1

      • 使用git reset HEAD丢弃所有暂存区的修改
    • 第二步按场景1操作
  • 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

注意:使用版本退回操作git reset --hard 会导致所有暂存区和工作区的当前修改但未commit的内容全部丢弃. 特别:使用git reset --hard HEAD会导致上述结果,并在git reflog中生成记录,但不改变

文件名里有空格和()的情况

Git命令(或者所有的shell命令中)中出现括“()”时系统把它看做一个有特殊意义的命令从而尝试去执行它。
因此如果文件名中出现括号,系统找不到括号里要执行的命令就会报错。
我们要让系统忽略括号的特殊意义,方法是用“”双引号把文件名括起来,或者用转义符将括号转义.
例如文件名为git (1).md
以下的写法都是可以的:
git add "git (1).md" git add git" "\(1\).md git add git" (1)".md

删除文件

使用rm file_name删除本地文件
使用 git rm file_name提交删除到暂存区
使用git commit -m "balabala"提交到本地库
注意: 可以直接使用git rm file_name删除本地文件以及提交删除到暂存区,但仅用于暂存区有此本地文件的情况

远程仓库

注册GitHub账号

由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:

  • 第1步:创建SSH Key
$ ssh-keygen -t rsa -C  "youremail@example.com"

然后在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件id_rsa是私钥,id_rsa.pub是公钥.

  • 第2步:登陆GitHub

添加远程库

  • 要关联一个远程库,使用命令
git remote add origin git@server_name:path/repo_name.git

这里使用的命令是 git remote add origin git@github.com:HuChanghong/learngit.git

  • 关联后,使用命令git push -u origin master第一次推送master分支的所有内容

  • 此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改

从远程库克隆

  • 要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
git clone git@github.com:HuChanghong/MarkdownStudy.git
  • Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

取消链接并删除本地库

  • 查看本地库关联了那些远程库git remote -v
  • 取消本地目录下关联的远程库git remote rm origin
    • 此处origin是指你创建与远程库的链接的时候所使用的名字
  • 删除本地库
    • git branch #显示本地所有分支
    • git init 1#初始化仓库
    • ls -a 2#查看内部文件
    • rm -rf .git 3#强删.git
    • cd .. 5#回退
    • rm -rf file_name 6# 强删文件夹

分支管理

创建与合并分支

  • 查看分支:git branch
  • 创建分支:git branch <name>
  • 切换分支:git checkout <name>
  • 创建+切换分支:git checkout -b <name>
  • 合并某分支到当前分支:git merge <name>
  • 删除分支:git branch -d <name>

解决冲突

  • 当Git无法自动合并分支时,就必须首先解决冲突。
  • 解决冲突后,再提交,合并完成。
  • 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
  • 用git log --graph命令可以看到分支合并图。

分支管理策略

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

注意--no-ff参数,表示禁用Fast forward 因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去

git merge --no-ff -m "balabala" branch_name

Bug分支

Git提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作

git stash

我理解的stash,就像是把当前的WIP压栈(这里WIP的含义就是所有修改了但未commit的数据)然后再一个一个取出来,默认的git stash pop是按照自栈顶开始的顺序依次出栈,也可以使用git stash pop stash@{num}的方式取出指定的WIP 我们可以用git stash list查看当前压栈了多少个WIP

注意:git stash不能将未被追踪的文件(untracked file)压栈,也就是从未被git add过的文件,也就是你在使用git status命令看到的提示Untracked files所列出的文件,所以在git stash之前一定要用git status确认没有Untracked files 另外在有WIP没有commit 或者stash的情况下是无法切换分支的

Feature分支

  • 开发一个新feature,最好新建一个分支;
  • 如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除

多人协作

多人协作的工作模式通常是这样:

  • 查看远程库信息,使用git remote -v
  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  • 建立本地分支和远程分支的关联,使用git branch --set-upstream-to=origin/branch-name branch-name
  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

rebase

这是git文档强调的使用注意情形和原则

gitbook.liuhui998下图来自这篇链接
git从安装到应用的学习-LMLPHP
git从安装到应用的学习-LMLPHP

标签管理

类似IP和域名的关系

创建标签

  • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id

    • git tag tag_name commit_id
  • 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    • -a指定标签名,-m指定说明文字
  • 命令git tag可以查看所有标签。
    • git show tag_name查看标签信息

操作标签

命令git push origin <tagname>可以推送一个本地标签; 命令git push origin --tags可以推送全部未推送过的本地标签; 命令git tag -d <tagname>可以删除一个本地标签; 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

关联多个远程库

先用git remote -v查看远程库信息

如果本地库已经关联了origin的远程库,并且,该远程库指向GitHub。我们可以删除已有的GitHub远程库

git remote rm origin

使用如下命令关联远程库

git remote add remote_name git@server_name:path/repo_name.git

例如要关联Github远程库

git remote add github git@github.com:Github_id/repo_name.git

再比如要关联码云远程库

git remote add gitee git@gitee.com:Github_id/repo_name.git

此时要推送到不同的远程库则代码中使用对应的远程库名称(remote_name)

git push remote_name master

自定义Git

忽略特殊文件

忽略文件的原则是:

  1. 忽略操作系统自动生成的文件,比如缩略图等;
  2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

可以用git add -f强制添加被gitignore的文件 可以用git check-ignore命令检查是什么规则导致的无法添加文件

git check-ignore -v file_name

注意:.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

Windows下创建.gitignore文件的常用方法

  1. git bashcd切换到根目录touch .gitignore命令创建
  2. 在资源管理器创建文件时,文件命名“.gitignore.”,注意结尾有个.号,回车确认时系统会自动存成.gitignore
  3. 打开文本编辑器,保存时文件名输入“.gitignore”,保存类型选“所有文件
  4. 进入cmd命令行,执行 echo > .gitignore 输入空内容并创建文件,或执行 rename somefile .gitignorecopy somefile .gitignore 从已有文件复制、重命名。

配置别名

只需要先如此如此

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

然后就可以只用git lg输出辣么一长串的代码,看到这里我沉默了,然后我想了半天,我为什么干脆不用GitDesktop呢,可能就是因为热爱敲代码吧(雾

配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。 每个仓库的Git配置文件都放在.git/config文件,打开配置文件,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可 当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

查看用户的配置信息使用git config --global --list命令 查看当前仓库的配置信息使用git config --local --list命令

删除别名

命令删除一个已定义的别名 git config --global --unset alias.ci cd .git vi config打开对应的配置文件,别名就在[alias]后面,直接把对应的行删掉即可

05-11 16:53
查看更多