Git 是分布式的版本控制系统,在前一篇文章已经写过 Windows 的安装过程了,然后这里是使用上的一些笔记。

但首先还是记录一下 Linux 上的安装

先检查一下有没有安装:

git

对 Debian 或 Ubuntu:

sudo apt-get install git
sudo apt-get install git-core

其他 Linux:

./config
make
sudo make install

关于 Mac,原文档

创建一个仓库

首先配置帐号信息:

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

git config user.name
git config user.email

然后创建仓库:

git init

提交更改,写提交说明是一个好习惯:

git add --all
git commit -m "First Push"

管理仓库

查看仓库状态和 diff:

git status
git diff

查看历史提交:

git log
git log --pretty=oneline

git reflog

回退上一版本/指定版本:

git reset --hard HEAD^
git reset --hard 839a

撤销未提交的修改:

git reset HEAD readme.txt
git checkout -- file

文件删除和恢复:

git rm test.txt
git checkout -- test.txt

工作区的概念

  • 工作区就是实时操作的目录,add 后没有提交的修改记录于版本库的【暂存区】
  • Git 管理修改,而不是文件,另外,凌晨3点太真实了。。

1_工作区.jpg

远程仓库

首先关联账户:

ssh-keygen -t rsa -C "youremail@example.com"

于是会在用户主目录里看到 .ssh 目录,里面有 id_rsaid_rsa.pub 两个文件,分别是私钥和公钥。
登陆 GitHub,打开【Account settings】-【SSH Keys】页面,然后【Add SSH Key】,Title 用于区分设备,在 Key 文本框里粘贴 id_rsa.pub 文件的内容。

在 Github 在线创建仓库后后,按提示将本地内容推送上去:

git remote add origin https://github.com/Gearkey/test.git
git push -u origin master

之后的推送可以直接:

git push origin master

从远程库克隆:

git clone git@github.com:gearkey/test.git

区别于前面使用 https 的地址,这样的地址可以不用每次验证密码。

分支管理

分支用来标记不同的开发通道。
相对于直接修改,在多人协作时这也意味着更安全,Git 鼓励大量使用分支。

创建并切换到 dev 分支:

git checkout -b dev

git branch dev
git checkout dev

git switch -c dev

查看、删除、合并分支:

git branch
git branch -d dev
git merge dev

使用 checkoutswitch 切换分支:

git checkout master
git switch master

switch 运行提示 git: 'switch' is not a git command. See 'git --help'.。。

冲突解决

通过 git status 可以看到冲突的文件列表。
打开文件可在相应位置看到类似这样的内容,修正后提交即可。

<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

查看分支合并情况:

git log --graph
git log --graph --pretty=oneline --abbrev-commit

分支管理策略

合并时可禁用 Fast forward 模式,删除分支后,不会丢失分支信息。

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

处理 bug 分支

当手头有其他事在做时可以用 git stash 保留工作现场,然后进行 bug 修复,结束后恢复工作现场并删除原有存档。

git stash pop

git stash list
git stash drop

git stash apply stash@{0}

在另一分支跟进已修复的 bug:

git cherry-pick 4c805e2

通过分支管理,大大减少了重复劳动。

Feature 分支

分支如果没有被合并时删除操作会被阻止,强行删除:

git branch -D <name>

多人协作

查看远程仓库信息:

git remote
git remote -v

默认远程库名是 origin,只有被指定的分支会向远程推送。
默认拉取的仓库只有 master 分支,通过 git checkout -b dev origin/dev 载入 dev 分支。

因为已有更新版本而推送失败的话,先 git pull 把最新仓库拉取下来,合并后提交。
若本地仓库没有和远程对应起来也会报错,这个时候用 git branch --set-upstream-to=origin/dev dev 把他们对应起来就可以顺利提交了。

为了方便查看,可以用 git rebase 改变代码提交的节点,把分叉的历史变成一条直线。

标签管理

标签实际上是历史版本的一个标记,查看和打上一个标签:

git tag
git tag v1.0
git tag v1.0 f52c633
git tag -a v1.0 -m "version 1.0 released" 1094adb

查看标签信息:

git show <tagname>

推送标签:

git push origin <tagname>
git push origin --tags

删除标签:

git tag -d v0.9
git push origin :refs/tags/v0.9

自定义 Git

可以通过修改 .gitignore 文件排除工程中无需提交的文件,对于许多工程,有已经写好的配置可以下载。
.gitignore 文件本身要放到版本库里,并且可以做版本管理。

配置别名,把复杂的命令简化:

git config --global alias.st status
git config --global alias.unstage 'reset HEAD'

仓库的配置文件是 .git/config,而当前用户的配置文件是在用户目录下的 .gitconfig

搭建Git服务器

环境是 Linux。

  1. 安装 Git:sudo apt-get install git
  2. 创建用户:sudo adduser git
  3. 收集所有用户的 id_rsa.pub,把它导入到 /home/git/.ssh/authorized_keys 文件里,一行一个
  4. 初始化仓库,选定一个目录后创建一个裸仓库,并把 owner 改为 git

    sudo git init --bare sample.git
    sudo chown -R git:git sample.git
    
  5. 禁用 shell 登录,找到 /etc/passwd,将

    git:x:1001:1001:,,,:/home/git:/bin/bash
    

    改为

    git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
    
  6. 克隆远程仓库:git clone git@server:/srv/sample.git

同时把仓库部署到码云

关于远程仓库,因为 Github 在国内可能很慢,所以可以考虑码云Coding 等国内服务,这里就用了码云。

一样的把仓库关联起来:

git remote add gitee https://gitee.com/gearkey/gearkey.git

不过不同的是,这里把远程库命名为 gitee 了,以和原本的远程库 origin 做区分,然后就可以单独推送:

git push gitee master

当然也可以删除:

git remote rm gitee

另外,他们也有提供静态博客托管服务,可以按照文档搭建:码云 PagesCoding Pages
码云提供的服务器在上海,但免费版不支持绑定域名和自动部署,Coding 支持绑定域名并可建立数个站点,但服务器在香港。

Git 是一个伟大的东西,而我们要做的就是用好它。

参考文档:https://www.liaoxuefeng.com/wiki/896043488029600