Git使用

一、git的诞生

  • Linux代码量过于庞大,Linus手动合代码合不过来
  • BitMover免费提供BitKeeper,遭到破解,中止合作
  • Linus历时两周时间用C写出了Git
  • 2008年Github上线

二、集中式vs分布式


集中式 分布式
相关系统 CVS、SVN Git
是否有中央服务器
是否必须联网

三、安装Git


  1. Linux
1
sudo apt-get install git
  1. MacOS
    通过Homebrew安装
1
brew install git
  1. Windows
    直接从官网下载安装器

四、Git初始配置


设置用户名和邮箱

1
2
git config --global user.name "Your Name"
git config --global user.email "[email protected]"

五、创建版本库(repository)


  1. 如何创建
    创建一个目标文件夹,并进去文件夹
    在命令行中输入”git init”
    观察到文件夹中生成了一个名为“.git”的隐藏目录,即表示创建成功

该目录用于跟踪管理版本,不要随意修改

  1. 把文件添加进Repo

事前注意

版本控制系统只能跟踪文本类的变化
文本建议统一使用UTF-8编码
Windows系统默认的记事本会在UTF-8编码文件的开头添加BOM字符,导致各种莫名奇妙的问题,使用Notepad++代替记事本,Notepad++默认把编码设置为“UTF-8 without BOM”,即可解决

  • 编写一个readme.txt文件
    使用“git add”将文件添加到Repo中
1
git add readme.txt
  • 使用“git commit”将文件提到到Repo中
1
git commit -m "wrote a readme file"

其中-m 用于输入本次提交的说明
提交成功后会告诉你两件事情:

1
2
1 file changed:1个文件被改动了
2 insertions:插入了两行内容

六、观察修改


修改readme.txt文件

  • 使用git status观察结果

    结果展示readme.txt被修改过

  • 使用git diff查看修改内容

    可以看到绿色的就是修改后的结果

  • 使用git add添加文件,然后用git status再次查看

    add后,下面这段变成绿的了

  • 使用git commit提交文件,再用git status查看


七、版本回退


  1. 使用git log查看历史提交记录
1
--pretty=oneline 可简化输出信息
  1. 使用git reset来回退版本
  • HEAD表示当前版本,HEAD^表示上一个版本,HEAD~100表示往上100个版本

    ^在cmd控制台中被认为是个换行符,所以系统一直提示你More?
    解决办法:

      1. 加引号: git reset –hard “HEAD^”
      1. 加一个^: git reset –hard HEAD^^
      1. 换成~: git reset –hard HEAD~ 或者 HEAD~1
  • 恢复到未来的版本,只需要找到那个版本的哈希数前四位即可

  1. 使用git reflog查询你做出的每一次命令

八、工作区和暂存区


  1. 工作区
    即本地工作目录

  2. 版本库(Repository)

  • .git就是版本库
  • stage是版本库中的一个暂存区
    • git add 这个操作是将修改文件从工作区添加到暂存区
  • 版本库中有一个主分支叫master
    • git commit 就是将暂存区的文件添加到master分支
  • HEAD指针指向当前版本

九、撤销修改


  1. 在工作区未add到暂存区
1
git checkout -- <file>
  1. 已经add到暂存区
1
git reset HEAD <file>
  1. 已经commit上去
    参考版本回退

十、删除文件


1
git rm <file>

十一、远程仓库


  1. 配置Github
  • 创建SSH Key
1
ssh-keygen -t rsa -C "[email protected]"

生成的id_ras为私钥,id_rsa.pub为公钥

  • 在Github配置SSH Key
  1. 添加远程库
  • 在Github上创建Repo
  • 将本地与远程库关联
1
git remote add origin ssh://git@[ip]:[port]/home/git/<projectname>.git
  • 将本地的文件推到远程
1
git push -u origin master // -u 将本地master分支和远程master分支关联起来
  1. 从远程库克隆
    用Clone将远程库拖到本地
1
git clone ssh://git@[ip]:[port]/home/git/<projectname>.git

十二、分支管理


  1. 创建与合并分支
  • master指向提交,HEAD指向master

  • 新建一个dev分支时,HEAD指向dev

  • 合并的时候,就是把master指向dev当前的提交

  • 实战

    • 创建 dev 分支
    1
    git checkout -b dev

    相当于:

    1
    2
    git branch dev
    git checkout dev

    • 查看当前分支
    1
    git branch
    • 合并分支
    1
    git merge dev
    • 删除分支
    1
    git branch -d dev   // -D 可以强行删除尚未合并的分支
  • switch

    • checkout 一功两用,让人迷惑
    • 新版本使用Switch来创建分支
    1
    git switch -c dev
  1. 解决冲突


<<<<<<<,=======,>>>>>>>标志出不同分支的内容,需要手动修改

查看分支合并情况

1
git log --graph --pretty=oneline --abbrev-commit
  1. 分支管理策略
    使用–no-ff禁用Fast forward,更方便地观察分支在log中的合并情况
1
git merge --no-ff -m "merge with no-ff" dev
  1. Bug分支
    正在开发feature时,突然需要修复临时Bug的解决方案
  • 保存当前的工作现场
1
git stash
  • 修复BUG

  • 恢复工作现场

    1
    2
    3
    4
    5
    git stash list
    git stash pop
    git stash apply
    git stash apply stash@{0}
    git stash drop
  • 将修复的BUG合并到当前分支

1
git cherry-pick <合并版本号>
  1. 多人协作
  • 查看远程库信息
1
git remote
  • 查看远程库详细信息

    1
    git remote -v
  • 推送分支

    • 哪些分支要推送到远程

      • master分支是主分支,需要时刻与远程同步
      • dev分支是开发分支,团队成员需要在上面工作,所以也要推送到远程
      • bug和feature看你们是否合作开发
    • 使用 Push 推送分支

      1
      git push origin dev
  • 抓取分支

    • 使用checkout抓取远程分支

      1
      git checkout -b dev origin/dev
    • 将本地的dev分支与远程的dev分支关联起来

      1
      git branch --set-upstream-to=origin/dev dev
    • 从远程拉取最新版本

      1
      git pull
  1. Rebase
  • Git会用 HEAD->master 和 origin/master 分别标识本地当前版本和远程仓库的当前版本

  • 使用场景

    • 合并 commit 记录,保持日志简介

      • 合并最近4次提交记录

        1
        git rebase -i HEAD~4
      • 进入vi模式,修改提交记录

      • 如果不小心退出了vi,使用 –edit-todo 恢复

        1
        git rebase --edit-todo
      • 修改完保存

        1
        git rebase --continue
    • 相比 merge 来说会减少分支合并的记录

      • 你创建了一个 feature 分支进行开发
      • 你的同事完成了一次 hotfix,合并到 master 分支里面,这时 master 已经领先你的 feature 分支
      • merge 之后,查看提交记录,这时会发现日志有点混乱
      • 回到第二步,使用rebase
        1
        (feature) git rebase master
        • 把 feature 分支里面的每个 commit 取消掉
        • 临时保存为 patch 文件,存在 .git/rebase 目录下
        • 把 feature 分支更新到最新的 master 分支
        • 把上面保存的 patch 文件应用到 feature 分支上
  • 是一个危险命令,改变了提交历史,可能会导致其它人提交丢失

十三、标签管理

  1. 创建标签
  • 打标签

    1
    git tag <name>
    • 默认标签是打在当前 commit 上的
  • 给历史记录打标签

    1
    git tag <name> <versioncode>
    • 使用 -a 指定标签名, -m 指定说明文字
  • 查看所有标签

    1
    git tag
  • 查看单个标签信息

    1
    git show <name>
  1. 操作标签
  • 删除标签

    1
    git tag -d <name>
  • 推送标签到远程

    1
    git push origin <name>
  • 推送所有标签到远程

    1
    git push origin --tags
  • 删除远程标签

    1
    2
    git tag -d <name>
    git push origin :ref/tags/<name>

十四、自定义Git

  1. 让Git输出日志显示颜色
1
git config --global color.ui true
  1. 忽略特殊文件
  • 在根目录创建一个 .gitignore

    • 参考配置
  • 需要哪些文件?

    • 系统生成的文件
    • 编译生成的中间文件和可执行文件
    • 带有敏感信息的配置文件
  • 强行提交被忽略的文件

    1
    git add -f <file>
  • 检查文件是否被忽略

    1
    git check-igonre -v <file>
  1. 配置别名
  • 将Status改为st

    1
    git config --global alias.st status
  • 使用unstage代替回退文件

    1
    git config --global alias.unstage reset HEAD
  • 显示最后一次提交信息

    1
    git config --global alias.last 'log -1'
  • 美化log

    1
    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" 
  • 配置文件位置

    • 当前仓库

      1
      .git/config
    • 全局

      1
      <系统用户目录>/.gitconfig
  1. 搭建 Git 服务器
    1. 安装git
      1
      sudo yum install git
    1. 创建 git 用户
      1
      sudo adduser git
    1. 创建证书登录
    • 把所有 id_rsa.pub 导入到 /home/git/.ssh/authorized_keys
    1. 初始化 Git 仓库
    • 选定目录为/home/git/sample.git,创建仓库

      1
      sudo git init --bare sample.git
      • 这是一个裸仓库,没有工作区
      • 纯粹为了共享,不能直接修改
    • 修改用户为git

      1
      sudo chown -R git:git sample.git
    1. 禁用 shell 登录
    • 编辑 /etc/passwd
      1
      2
      git:x:1001:1001:,,,:/home/git:/bin/bash
      git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
    1. 克隆远程仓库
      1
      git clone ssh://git@<ip>:<port>/home/git/sample.git
  • 管理公钥

    • Gitosis
  • 管理权限

    • Gitolite

十五、取消对文件的跟踪

在项目中遇到一个问题,就是改了一个dev文件之后,不希望上传到服务器。
因为这会导致其他人本地的dev文件也跟着改动。
但是已经提交过的文件,在.gitignore中设置是无效的。
于是在网上搜寻的时候,发现一种方法:

1
git rm -r --cached 文件名

这是一个坑,它会把服务器中的dev文件也一起删除掉

正确的做法是使用以下指令:

1
git update-index --assume-unchanged 文件名

参考
Git教程- 廖雪峰
How to stop tracking and ignore changes to a file in Git?


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!