2019-10-14

Git 工具使用分享

我们工作中或多或少都会使用 Git 作为 Code 分布式版本控制系统,以下是本人总结的 Git 常用命令。

目录

基本概念

安装

Windows

Mac

可视化工具 (sourcetree、fork)

配置 (git config / .gitconfig)

忽略文件 (.gitignore / .gitkeep)

仓库 (git clone / git init / git remote)

分支 (git branch / git checkout)

提交 (git add / git commit / git push)

查看 (git status / git log / git diff / git show)

拉取 (git pull / git fetch)

合并 (git merge)

撤销/回滚 (git reset)

解决冲突 (git reset)

Tag (git tag)

Stash (git stash)

基本概念

工作区/工作目录(Workspace/Working Directory): 就是你平时存放项目代码的目录。

暂存区(Stage/Index):用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息, 一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

仓库区/版本库(Repository/Git Directory):就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。

远程仓库(Remote Directory):gitee.com

一般文件 Git 操作流程:

通过 vim REDEME.md 更改 工作区 文件内容。

通过 git add 命令将 工作区 文件添加到 暂存区(Index/Stage) 。

通过 git commmit 命令提交到 仓库区。

通过 git push 命令推送到 远程仓库。

安装

Windows

Mac: brew install git

Git 可视化工具 - 适用于 Mac & Windows 平台

sourcetree 相比 fork 卡、中文菜单、Bug?

fork

配置

Git 全局配置, 默认 Git 配置信息存储在用户目录即: ~/.gitconfig 文件中。

git config --global user.name"codezm"git config --global user.email"codezm@163.com"#配置-保存账号及密码至本地~/.git-credentials,仅第一次手动录入账号及密码git config --global credential.helper store#配置-全局忽略文件,默认文件不存在自行新建文件即可git config --global core.excludesfile ~/.gitignore# git使用外部工具合并冲突后避免生成多余的.orig备份文件git config --global mergetool.keepBackupfalse#查看Git配置信息。git config --list

vim ~/.gitconfig

[user]    name = codezm    email = codezm@163.com[credential]    helper =store[core]    excludesfile = ~/.gitignore    editor = vim[mergetool]    keepBackup =false[alias]    co = checkout    lg = log --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset%s%Cgreen(%cr)%C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

忽略文件

Git 全局忽略规则配置文件,应用于所有 Git 项目,配置文件路径可使用命令 git config core.excludesfile 查看 ––– 默认不存在需配置。

$ vim `git config core.excludesfile`############################################ OS generated files ############################################.DS_Store.DS_Store?*.swp._*.Spotlight-V100.TrashesIcon?ehthumbs.dbThumbs.db################################################# packages #################################################*.7z*.dmg*.gz*.iso*.jar*.rar*.tar*.zip# Compiled source ####################*.com*.class*.dll*.exe*.o*.so*.pyc# Logs and databases #######################*.log*.sqlite

Git 忽略规则配置文件: .gitignore,在单个 Git 项目下创建仅适用于此项目。

#忽略项目中所有log文件夹(/runtime/log、/log):log#忽略项目根路径下整个runtime文件夹:/runtime/*#但排除runtime根文件夹下某个文件:!/runtime/wechat-post-data.log#注意:若想排除以下文件是无效的。# !/runtime/pid/swoole/master.pid#解决方案,这也是`忽略某个文件夹,但又不想忽略这个文件夹下的某个子目录`的解决方案。!/runtime/pid/runtime/pid/*!/runtime/pid/swoole/runtime/pid/swoole/*!/runtime/pid/swoole/master.pid#检查UI-Images.zip文件被哪个忽略规则所匹配:git check-ignore -v /tags/UI-Images.zip#忽略规则强制添加至Git版本库:git add -f /tags/UI-Images.zip

.gitkeep 文件的作用

Git 默认是不允许提交一个空目录到版本库的,可以在空的文件夹里面建立一个 .gitkeep 文件,然后提交去即可。其实在 Git 中 .gitkeep 就是一个占位符。

示例: 需要 Git 提交 Yaf - views 空目录。

仓库

基于远程项目克隆至本地

首先,gitee 创建远端「 remote 」仓库: git-demo,然后克隆至本地目录:

cd~gitclonehttps://gitee.com/codezm/git-demo.git git-democdgit-demo

基于本地项目创建 git 仓库

cdgit initgit remote add origin https://gitee.com/codezm/git-demo.gitgit add .git commit -m'First commit.'git push origin master

修改本地项目 git 仓库地址

cdgit remoteset-url origin

分支

新 Git 项目默认 ( git clone ) 所在分支为: master。

#查看本地所在分支,带*表示当前所在分支.git branch#查看远程所有分支# git branch -r#查看所有分支,包含本地和远程服务器git branch -a#创建分支git branch #示例-于master分支基础上创建dev分支: git branch dev#创建并检出至一个新分支git checkout -b #分支切换,切换至dev分支git checkout #删除本地分支git branch -d #分支重命名# git branch -m <old-branch-name> <new-branch-name>#删除远程服务器分支# git push origin --delete <branch-name># git push origin :<branch-name>

注意: 本地分支删除时需要先切换至其他分支再操作要删除的分支。

提交

#编辑工作区项目代码.echo"test git"> README.md#提交至暂存区.git add README.md#遍历询问是否添加-仅限已添加至Git项目文件,新增文件排除。# git add -p#添加工作目录所有新增/改动文件# git add .#提交至本地仓库区.git commit -m'Modify README.md'#提交至远端仓库-只有提交后他人才可使用你提交的代码.git push origin master# -u设置origin为默认主机,之后就可以直接使用git push推送至远程服务器。#默认只推送当前分支: simple方式。Git 2.0版本之前,默认采用matching方法,会推送所有有对应的远程分支的本地分支git push -u origin master

查看

查看哪些文件改动了?「 git add 前查看 」

git status

工作区文件. 「 git 文件差异对比 」

git diff#对比某一文件差异# git diff <file-name>

暂存区文件: git add. 「 git 文件差异对比 」

git diff --cached#对比某一文件差异git diff --cached

版本库文件: git commit. 「 git 文件差异对比 」

#查看此所有文件更改详情.git show #示例-仅查看指定文件: git show a09ce4377cd292 README.md#对比两次的文件更改详情.# git diff <COMMIT-ID>...<COMMIT-ID> README.md#对比两次涉及的所有文件名# git diff <COMMIT-ID>...<COMMIT-ID> --name-only

giteem - 对比视图 | 示例

修改了哪些文件?「 git commit 后查看 」

gitlog--stat# git show <COMMIT-ID> --name-only#展示最后一次提交修改的文件# git log --stat -n 1#展示 # git log --oneline

拉取

git fetch 是将远程主机的最新内容(所有远程仓库的 branch、tag)拉到本地,用户在检查了以后决定是否合并到工作本机分支中。

git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge。

git pull origin/master# git fetch# git merge origin/master

合并

git checkout dev# git pull有个前提当前分支dev对应远程分支origin/dev已存在,此处也可使用: git fetchgit pullgit merge origin/kakaguo#若存在冲突则解决完冲突后还需要执行以下操作:# git add .# git commit -m ''git push origin dev

撤销/回滚

#非Git项目管理文件撤销「删除」,即:不在git版本控制下的新增文件rm -f README.md#新增文件撤销git rm --cached NEW_README.md#工作区文件撤销「还原」git checkout -- README.md#暂存区文件撤销「取消git add操作」git reset HEAD README.md#本地仓库文件撤销「取消git commit操作」gitlog##重置HEAD和索引####此时若是又修改了README.md文件再执行git reset后文件README.md内容会展示什么?git reset 等价于git reset --mixed ##重置HEAD、索引和工作区,会重置以下工作区域文件: -执行此操作是危险的。## 1.对README.md所有操作丢弃.## 2.若工作区对README.en.md做了修改但未git commit,即使git add到了暂存区也会被丢弃。git reset --hard #远程仓库撤销:主要用于撤销已push的commit操作,即git commit -> git push -> git reset -> git push -fgit push -f

冲突解决

分支 hanlu、kakaguo 同时修改 README.md 文件.

git checkout hanluecho'hanlu'> README.mdgit add .git commit -m'Modify README.md by hanlu.'git push -u origin hanlugit checkout kakaguoecho'kakaguo'> README.mdgit add .git commit -m'Modify README.md by kakaguo.'git pushgit checkout devgit pullgit merge origin/hanlugit push origin devgit merge origin/kakaguo#解决冲突git add .git commit -m'Merge kakaguo'git push origin dev#撤销合并「注意:仅在合并失败(快速合并失败被阻止)时执行」,以下命令对工作区代码无影响:# git reset --merge# git merge --abort

Tag

打标签、项目版本管理.

#创建Taggit tag #示例-创建1.0.0版本Tag: git tag v1.0.0#显示所有Taggit tag#加上-l命令可以使用通配符来过滤tag# git tag -l "1.0.*"#给加Tag并添加备注信息.# git tag -a <tag-name> <commit-id> -m <comment-message>#显示Tag详情:显示、Tag备注信息等# git show <tag-name>#推送至远程仓库# git push origin <tag-name>#推送本地所有Taggit push origin --tags#切换至某个Tag,与分支类似git checkout #删除本地某个Tag# git tag -d <tag-name> <tag-name-mores>#删除远程仓库Tag# git push origin --delete tag <tag-name># git push origin :refs/tags/<tag-name>

Stash - 贮藏

适用场景: 临时合并他人分支存在 - 同时更改相同文件、分支可能存在冲突。

git stash#保存stash并设置名称,simple方式: git stash# git stash save <message>#仅还原# git stash apply#删除指定stash# git stash drop stash@{0}#还原并删除stash,git stash apply + git stash dropgit stash pop#列出所有stash# git stash list

注意: git stash pop 如果存在冲突文件将导致 drop 失败。

结语

每次 git push 前先拉取下 git pull origin master / git pull origin dev 代码。

仅merge部分文件:git rebase -i。

仅stash部分文件: git stash -p。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341

推荐阅读更多精彩内容

  • 前言 Git使用教程 Git是什么 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 ...
    90后的思维阅读 893评论 0 0
  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,755评论 0 10
  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,390评论 0 7
  • 这篇博文是自己在学习git过程中的思考总结。本文仅仅代表个人的看法,如有不妥地方还请本文文末留言。 😊 原文链接g...
    Ming_Hu阅读 1,043评论 4 18
  • 学生:张彤伊 给那个陪我玩耍了十三年的女孩子的信 张靖涵: 时间过的好快呀,静下心来慢慢的想一想,时间就像...
    我本为旭阅读 181评论 0 1