Skip to content

GIT ​

安装配置 ​

Git 可以在 windows、mac、linux 全平台系统使用。登录 https://git-scm.com/ 下载你系统的 Git 软件并进行安装。

安装后通过以下命令查看,显示版本号表示安装成功。

bash
git --version

图形界面管理软件 ​

推荐使用sourcetree,功能强大、跨平台、免费,下载地址 https://www.sourcetreeapp.com/

WARNING

新人建议直接通使用命令行管理 GIT

初始配置 ​

配置文件为~/gitconfig,执行任何 Git 配置命令后文件将自动创建。

第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

bash
git config --global user.email "thomas@163.com"
git config --global user.name "thomas"

基础入门 ​

常用命令 ​

  1. 初始化新仓库 git init
  2. 克隆代码 git clone https://github.com/gorilla/websocket.git
  3. 克隆指定分支 git clone -b dev git@github.com:gorilla/websocket.git
  4. 查看状态 git status
  5. 提交单个文件 git add main.go
  6. 提交所有文件 git add -A
  7. 使用通配符提交 git add *.js
  8. 提交到仓库中 git commit -m '提交信息'
  9. 提交已经跟踪过的文件,不需要执行 add git commit -a -m '提交信息'
  10. 删除版本库与项目目录中的文件 git rm main.go
  11. 只删除版本库中文件但保存项目目录中文件 git rm --cached main.go
  12. 修改最后一次提交 git commit --amend

基础流程 ​

  1. 首先克隆你的项目

    bash
    git clone https://github.com/test/test.git
  2. 创建新文件 main.go,查看没有被管理的文件

    bash
    git clean -n
  3. 将所有文件提交到暂存区

    bash
    git add .
  4. 不小心将工作区中的 main.go 文件删除了,可以将暂存区中的 main.go 恢复回来

    bash
    git checkout main.go
  5. 将文件提交到本地仓库,并使用 -m 选项说明完成的工作

    bash
    git commit -m '完成。。。'
  6. 将代码提交到远程服务器

    bash
    git push

工作区 ​

git clean 命令用来从工作目录中删除所有没有跟踪(tracked)过的文件

  1. git clean -n 告诉你哪些文件没有被跟踪,会被删除。
  2. git clean -f 删除当前目录下没有 trached 过的文件,不会删除.gitignore指定的文件
  3. git clean -df 删除当前目录下没有被 tracked 过的文件和文件夹
  4. git checkout . 将没有放入暂存区的所有文件恢复
  5. git checkout main.go 放弃指定文件的修改
  6. git checkout -- main.go 将文件从暂存区恢复(如果没有提交到暂存区,将恢复到最近版本)

暂存区 ​

  1. git add . 提交所有修改和新增的文件
  2. git add -u 只提交修改文件不提交新文件
  3. git ls-files -s 查看暂存区文件列表
  4. git cat-file -p 6e9a94 查看暂存区文件内容
  5. git reset 撤销上次提交到暂存区动作

日志查看 ​

  1. git log查看日志

  2. git log -p -2 查看最近 2 次提交日志并显示文件差异

  3. git log --name-only 显示已修改的文件清单

  4. git log --name-status 显示新增、修改、删除的文件清单

  5. git log --oneline 一行显示并只显示 SHA-1 的前几个字符

  6. 下面是自定义的精简日志信息

    bash
    git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

    可以在~/.zshrc配置文件中定义别名使用

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

    运行结果:

    bash
    * 7a9e5751 - (origin/master) 初始化vuepress仓库 (3 months ago) <thomas>

分支管理 ​

分支用于为项目增加新功能或修复 Bug 时使用

分支流程 ​

大部分情况下不会直接在 master 分支工作,我们应该保护这个分支是最终开发完成代码健康可交付运行的。

所以功能和缺陷(bug)修复都会新建分支完成,除了这个概念外与基本流程使用是一样的。

  1. 新建支付功能开发分支

    bash
    git branch pay
  2. 切换到新分支开始开发,这里的工作内容与上面的基础流程是一样的

    bash
    git checkout pay
  3. 开发完成执行提交

    bash
    git commit -m '支付功能'
  4. 合并分支到 master

    bash
    # 切换到master分支
    git checkout master
    
    # 合并pay分支的代码
    git merge pay
  5. 提交代码到远程仓库 master 分支

    bash
    git push

常用命令 ​

  1. git branch dev 创建分支

  2. git branch 查看分支

  3. git checkout dev 切换分支

  4. git checkout -b thomas 创建并切换分支

  5. git branch -m thomas main 将分支 thomas 更新为 main

  6. 合并 dev 分支到 master

    bash
    git checkout master
    git merge dev
  7. git branch -d dev 删除分支

  8. git branch -D dev 删除没有合并的分支

  9. git push origin :dev 删除远程分支

  10. git branch --no-merged 查看未合并的分支(切换到 master)

  11. git branch --merged 查看已经合并的分支(切换到 master)

历史版本 ​

bash
# 首先查看历史版本提交日志
git log
# 切换到提交的commitId历史版本
git checkout a5a0d2012be8939bb3505f2c10062458d74d0bfc
# 以历史版本commitId创建新分支
git checkout a5a0d2012be8939bb3505f2c10062458d74d0bfc -b 新分支名称

reset ​

使用 reset 恢复到历史提交点,重置暂存区与工作目录的内容。

可选参数 ​

reset 有三个选项可使用

  1. --hard 重置位置的同时,直接将working Tree 工作目录、index 暂存区及 repository 都重置成目标 reset 的节点的内容。
  2. --sort 重置位置的同时,保留working tree 工作目录和index 暂存区的内容,只让repository中的内容和reset目标节点保持一致。
  3. --mixed(默认)重置位置的同时,只保留working tree 工作目录的内容,但会将index 暂存区和repository中的内容更改 reset 目标节点一致。

使用示例 ​

  1. git reset将 add 到暂存区的内容回退
  2. git reset --hard b7545585454s4d554s45s4 恢复到指定提交版本(先通过 git log 查看版本号),重置 stage 区和工作目录里的内容。
  3. git reset --hard HEAD^^^恢复前三个版本
  4. git reset --soft 保留工作区的内容,只回退 commit 的动作。保留 working tree 工作目录的内容,index 暂存区与 working tree 工作目录的内容一致,只是仓库 repository 中的内容的改变。
  5. git reset HEAD -- .撤销暂存区的文件。
  6. git reset --hard清空工作区和暂存区的改动。
  7. git reset HEAD hd.js放弃已经 add 暂存区的文件 hd.js

其他知识 ​

定义别名 ​

通过创建命令别名可以减少命令输入量,有几种方式进行设置

配置文件定义 ​

修改配置文件~/.gitconfig 并添加以下命令别名配置段

bash
[alias]
	a = add .
	c = commit
	s = status
	l = log
	b = branch

现在可以使用git a实现git add .一样的效果了。

系统配置定义 ​

window 用户可以修改~/.bashrc或~/.bash_profile文件。

mac/linux 修改 ~/.zshrc文件中定义常用的别名指令,需要首先安装 zsh 命令行扩展

bash
alias gs="git status"
alias gc="git commit -m"
alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
alias gb="git branch"
alias ga="git add -A"
alias go="git checkout"
alias gp="git push;git push github"

命令行直接使用gs 即可以实现git status一样的效果了。

window 系统需要使用 git for window 中的Git Base软件

.gitignore ​

.gitignore 用于忽略提交的文件

  • 所有空行或者以注释符号#开头的行都会被 git 忽略
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录
  • 可以使用标准的 glob 模式匹配。
bash
.idea
/vendor
.env
*.txt

冲突解决 ​

不同分支修改同一个文件或不同开发者修改同一个分支文件都可能造成冲突,造成无法提交代码。

  1. 使用编辑器修改冲突的文件
  2. 添加暂存git add .表示已经解决冲突
  3. git commit 提交完成

Stashing ​

当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则你以后无法回到这个工作点。

“暂存”可以获取你工作目录的中间状态----也就是你修改过的被追踪的文件和暂存的变更----并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

  1. 储藏工作 git stash
  2. 查看储藏列表git stash list
  3. 应用最近的储藏git stash apply
  4. 应用更早的储藏git stash apply stash@{2}
  5. 删除储藏git stash dorp stash@{0}
  6. 应用并删除储藏 git stash pop

Tag ​

Git 也可以对某一时间点上的版本打上标签,用于发布软件版本如 v1.0

  1. 添加标签git tag v1.0
  2. 列出标签git tag
  3. 推送标签git push --tags
  4. 删除标签git tag -d v1.0
  5. 删除远程标签git push origin :v1.0

打包发布 ​

对 master 分支代码生成压缩包供使用者下载使用,--prefix指定目录名

bash
git archive master --prefix='download/' --format=zip > master.zip

远程仓库 ​

创建仓库 ​

你需要在Github、码云等,先创建好仓库。

SSH ​

生成密钥 ​

使用 ssh 连接 Github 发送指令更加安全可靠,也可以免掉每次输入密码的困扰。

  1. 在命令行中输入以下代码(windows 用户使用 Git Bash)
ssh-keygen -t rsa

一直按回车键直到结束。系统会在~/.ssh目录中生成id_rsa和id_rsa.pub,即私钥id_rsa和公钥id_rsa.pub。

  1. 检查~/.ssh目录下是否有config文件,如果没有,就需要创建一个config文件(无后缀名)。

    Mac创建config

bash
touch ~/.ssh/config

​ 然后将下面代码粘帖至~/.ssh/config文件中:

bash
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
  1. 向 Github 等仓库,添加id_rsa.pub公钥内容。

关联远程 ​

  1. 创建本地库并完成初始提交

    bash
    echo "# test" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
  2. 添加远程仓库

    bash
    git remote add origin git@github.com:mahongyi/test.git
  3. 查看远程库

    bash
    git remote -v
  4. 推送数据到远程仓库

    bash
    git push -u origin master
  5. 删除远程仓库关联

    bash
    git remote rm origin

通过 clone 克隆的仓库,本地与远程已经自动关联,上面几步都可以省略。

pull ​

拉取远程主机某个分支的更新,再与本地的指定分支合并。

  1. 拉取 origin 主机的 ask 分支与本地的 master 分支合并 git pull origin ask:ask
  2. 拉取 origin 主机的 ask 分支与当前分支合并 git pull origin ask
  3. 如果远程分支与当前本地分支同名直接执行 git pull

push ​

git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相似。

  1. 将当前分支推送到origin主机的对应分支(如果当前分支只有一个追踪分支 ,可省略主机名)

    bash
    git push origin
  2. 使用-u选项指定一个默认主机 ,这样以后就可以不加任何参数直播使用git push。

    bash
    $ git push -u origin master
  3. 删除远程ask分支 git push origin --delete ask

  4. 本地 ask 分支关联远程分支并推送 git push --set-upstream origin ask

多库提交 ​

可以将代码提交到多个远程版本库中,比如提交到了 Github 与 Gitee 两个库中。

bash
# 增加一个远程库
git remote add github git@github.com:mahongyi/test1.git

# 提交到远程库
git push github

也可以在~/.zshrc 文件中定义别名,下面是定义的别名。这时使用 gp 将同时提供到 github 与 gitee

bash
alias gp="git push & git push github"