作者:谌吉 @前端之道发布于:06-14 22:30阅读:386500

cover

引言

由于时常记不住命令以及操作流程 (其实是练得太少了 - -!),必须笔记来一发。

廖雪峰老师的 Git 教程 感觉已经做得很好了;除了版本控制外,还教了如何进行团队协作。

以下记录自己实战过程中的命令(囊括了大部分基础命令)作备忘录。


创建版本库

初始化一个 Git 仓库

1.进入项目根目录,如:

$ cd ~/projects/learngit
$ pwd // 显示当前目录
/Users/james/projects/learngit

2.通过 git init 命令把目录变成 Git 可管理的仓库:

$ git init
Initialized empty Git repository in /Users/james/projects/learngit

3.使用 ls -ah 可查看 .git 等隐藏目录

添加文件到 Git 仓库

1.把文件添加到仓库

$ git add readme.txt

可以多次 add 不同文件

2.把文件提交到仓库

$ git commit -m "wrote a readme file"
[master 1626163] wrote a readme file
 1 file changed, 1 deletion(-)

时光机穿梭

随时掌握工作区的状态,查看文件修改内容

$ git status //查看当前工作区状态
$ git diff readme.txt //查看具体修改内容

版本回退

1.回退版本

$ git log //查看提交历史记录
$ git log --pretty=oneline //精简输出信息

$ git reset --hard HEAD^ //回退至上一个版本
$ git reset --hard HEAD^^ //回退至上上个版本
$ cat readme.txt //查看文件内容

2.重返未来

$ git reflog //查看自己的每一次命令
$ git reset --hard 1626163 //根据 commit id 回退到指定版本

管理修改

必须先使用 add 才能被加入到 commit 中。

撤销修改

$ git checkout -- readme.txt //丢弃工作区的修改
$ git reset HEAD readme.txt //撤销暂存区的修改 (此条执行后,还需要执行上一条命令才能完全删除修改)
$ git reset --hard HEAD^ //版本回退 (不小心提交后,直接使用这条即可)

删除文件

$ rm test.txt
$ git status

$ git rm test.txt //确实从版本库删除文件
$ git commit -m "remove test.txt" //提交到版本库

$ git checkout -- test.txt //如果是误删,使用此条可恢复至文件最新版本。其本质是用版本库的版本替换掉。

远程仓库

1.创建 SSH Key

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

2.用户主目录中查找 .ssh

3.Github 账户的 Account settings 中找到 SSH & GPG Keys

4.点击 New SSH Key,填上任意 Title,在 Key 文本框里粘贴对应 .pub 公钥文件的内容。

添加远程仓库

1.GitHub 创建新项目

2.本地对应仓库目录下运行

$ git remote add origin git@github.com:yourGithubName/learngit.git

3.推送本地仓库所有内容

$ git push -u origin master //-u 是为了关联本地 master 分支与远程 master 分支
$ git push origin master

从远程库克隆

1.选择一个已建好的远程库 (费话) 2.执行命令

$ git clone git@github.com:yourGithubName/project.git

3.Git 支持多种协议,包括 https,但通过 ssh 支持的原生 git 协议速度最快。

分支管理

创建与合并分支

1.创建分支

$ git checkout -b dev //创建并切换至 dev 分支

等同于

$ git branch dev
$ git checkout dev

查看当前分支

$ git branch

2.合并分支

$ git merge dev

3.删除分支

$ git branch -d dev

Git 鼓励大量使用分支

解决冲突

1.如果两个分支中的同一个文件分别作了不同修改,此时合并会出错

$ git status //查看冲突文件
                                    //手动解决冲突
                                    //重新添加并提交至仓库
$ git log --graph --pretty=oneline --abbrev-commit //查看分支合并情况

分支管理策略

合并分支时,Git 会用 Fast forward 模式,删除分支后会丢掉分支信息

1.使用 --no-ff 参数,表示禁用 Fast forward:

以合并 dev 分支进 master 分支为例

git merge --no-ff -m "merge with no-ff" dev //merge 的同时添加 commit 描述

2.分支策略

master 分支应该是稳定的,仅用于发布新版本;

平时干活应该都在 dev 分支上,等到某个时候,发布新版本时,再把 dev 分支合并到 master 上;

每个人都在不同的分支上干活,然后时不时往 dev 分支上合并即可。

bug 分支

场景:正在开发时遇上 bug,dev 分支上的工作内容还未提交

1.储藏工作现场

$ git stash //储藏工作现场
$ git status //此时是干净的,可以放心创建分支来修复bug

2.新建分支上修复 bug

$ git checkout master //切换至需要修复的分支上
$ git checkout -b issue-101 //创建并切换至临时分支
                                    //添加并提交至版本库
$ git checkout master //切换至需修复的分支
$ git merge -no-ff -m "merged bug fix 101" issue-101 //合并已修复问题的分支
$ git branch -d issue-101 //删除分支
---
$ git checkout dev //切换回开发分支
$ git status //工作区是干净的

3.重回工作区,恢复现场

$ git stash list //查看存储的工作现场
$ git stash apply //恢复工作区
$ git stash drop //删除已存储的工作现场
---
$ git stash pop //或者直接使用此条命令,同时恢复并删除存储的工作现场
$ git stash list //查看存储,已删除
$ git stash apply stash@{0} //用于恢复指定的 stash

feature 分支

新建一个分支开发 feature

如需强行删除

$ git branch -D feature-vulcan

多人协作

$ git remote //查看远程库的信息
$ git remote -v //更详细的信息
---
//如果没有推送权限,则无法看到 push 的地址

推送分支

$ git push origin master
$ git push origin dev

并不是所有分支都有必要推送至远程

  • master 主分支必须远程同步
  • dev 开发分支所有成员都需要在上面工作,也要远程同步
  • bug 分支只用于本地修复 bug
  • feature 分支取决于是否和小伙伴合作开发

默认抓取分支只能 clone master 主分支,如果要抓去 dev 分支

$ git checkout -b dev origin/dev

如果推送时,和远程库产生冲突

$ git pull //先从远程库把最新的提交从 origin/dev 抓取下来

发现失败了,原因是没有指定本地 dev 分支与远程 origin/dev 分支的链接

$ git branch --set-upstream-to origin/dev dev //设置链接
$ git pull //重新 pull
                                    //解决冲突,合并后 push

标签管理

创建标签

$ git tag v1.0 //打一个新标签
$ git tag //查看所有标签

忘了打标签

$ git log --pretty=oneline --abbrev-commit //找到提交历史对应的 commit id
$ git tag v0.9 a76db13 //给指定 commit id 打标签
$ git show v0.9 //查看标签信息

-a 指定标签名,-m指定说明文字

$ git tag -a v0.1 -m "version 0.1 released" 1daea47

-s 用私钥签名一个标签

$ git tag -s <tagname> -m "blablabla..."

操作标签

删除标签

$ git tag -d v0.1

推送标签

$ git push origin v1.0
$ git push origin --tags

要删除远程标签

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

检查远程 tag 是否删除,登陆 Github 查看。

自定义 Git

让 Git 显示颜色

$ git config --global color.ui true

忽略特殊文件

某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件等等

创建一个 .gitignore 文件,编写类似如下配置信息:

# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

# My configurations:
db.ini
deploy_key_rsa

官方提供了各种配置文件,自行按需组合即可

忽略文件的原则是:

1.忽略操作系统自动生成的文件,比如缩略图等;

2.忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;

3.忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

最后需提交至 Git,就完成了!

$ git add -f App.class //强制添加到 Git
$ git check-ignore -v App.class //检查忽略规则是否写错

配置别名

告诉 Git,以后 st 就表示 status

$ git config --global alias.st status

还有别的命令可以简写,很多人都用 co 表示 checkoutci 表示 commitbr 表示 branch

$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

--global 参数是全局参数,所有Git仓库下都适用。

如命令 git reset HEAD file 可以把暂存区的修改撤销掉(unstage),配置一个 unstage 别名:

$ git config --global alias.unstage 'reset HEAD'

因此

$ git unstage test.py //此命令与下一条相同
$ git reset HEAD test.py

配置一个 git last,让其显示最后一次提交信息:

$ git config --global alias.last 'log -1' //是负一,不是负l

丧心病狂的 lg:

$ 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"
  • --global 全局配置文件地址
    /Users/james/.gitconfig
    
  • 每个仓库的 Git 配置文件,在仓库根目录下
    .git/config
    

别名就在 [alias] 后面,要删除别名,直接把对应的行删掉即可。

搭建 Git 服务器

略。

此篇转自我自己的 独立博客,欢迎来踩。

快来这里总结下学到的知识吧!

新建笔记