git

Git资料整理

在这里,我整理的并不是很多,大家可以稍微借鉴一下就好,git命令用得好可以偷点懒罢了。

操作流程

一图胜千言,你常用的几个命令大概就是这样的。这是阮一峰给出的样子:

image.jpg

官方git-scm是这样的:
image.png

只表明了一般的git本地操作流程: 1. 在工作目录中修改文件 2. 暂存文件,将文件的快照放入暂存区域 3. 提交更新,找到暂存区域的文件,将快照永久性存储到git仓库目录

命令清单

配置

.gitconfig配置文件,可以是电脑上的全局配置,或者项目目录下的项目配置 git config --list用于查看全局配置 我电脑上是log出:

credential.helper=osxkeychain
user.email=nanci_guo@xinyan.com
user.name=guonanci
push.default=matching
alias.s=status
alias.t=tag
alias.ck=checkout
alias.cm=commit
alias.ps=push
alias.pl=pull
alias.d=diff
alias.l=log
alias.rs=reset
alias.rv=revert
alias.m=merge
alias.unstage=reset HEAD --
alias.last=log -1 HEAD
url.https://.insteadof=git://
last.unstage=log -1 HEAD
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.precomposeunicode=true
remote.origin.url=git@gitlab.xinyan.com:spider/SDK_H5.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

你们在windows也试试,大致应该差不多

增加删除文件

# 添加指定文件/目录到暂存区
$ git add [file1] [dir1] [file2] ...

代码提交

git commit -m [msg]是提交暂存区到仓库区,git commit [file1] [dir1] [file2] ... -m [msg]是提交暂存区的指定文件到仓库区,git commit -a是提交工作区自上次commit之后的变化,直接到仓库区,git commit --amend -m [msg]是使用一次新的commit,替代上一次提交,如果代码没有任何变化,则用来改写上一次commit的提交信息,`git commit –amend [file1] [file2]是重做一次commit,并包括指定文件的新变化,其实如果不太注重commit message的话,–amend这个标志位几乎没什么用了。

分支

// 列出所有本地分支
git branch
// 列出所有远程分支
git branch -r
// 列出所有本地和远程分支
git branch -a
// 新建一个分支,但依然停留在当前分支
git branch [new-branch-name]
// 从指定分支新建一个分支,切换到新分支,与同名远程分支建立追踪关系
git checkout -b [new-branch-name] [base-branch-name:可选] && git push -u origin [new-branch-name]
// 合并指定分支到当前分支
git merge [branch-to-merge]
// 删除本地和远程的同名分支, 
git branch -d [branch-name] && git push origin :[branch-name]

查看信息

// 显示有变更的文件
git status
// 显示暂存区和工作区的差异
git diff
// 显示工作区和当前分支最新commit之间的差异
git diff HEAD
// 显示指定文件的每一行代码是谁在哪个时间改过,信息有点多哦。。
git blame [file]

远程同步

// 下载远程仓库的所有变动
git fetch [remote]
// 显示所有远程仓库
git remote -v
// 显示某个远程仓库的信息
git remote show [remote]
// 增加一个新的远程仓库,并命名
git remote add [shortname] [url]
// 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
// 上传本地指定分支到远程仓库
git push [remote] --force
// 推送所有远程分支到远程仓库
git push [remote] --all 

撤销

// 恢复暂存区的指定文件到工作区,我经常用
git checkout [file1] [dir1] ... 
// or 
git checkout .
// 重置暂存区的指定文件,与上一次的commit保持一致,但工作区不变
git reset [file]
// 重置当前分支的HEAD为指定commit,同时重置暂存区与工作区,与指定commit保持一致
git reset --hard [comit-log]

// 新建一个commit,用来撤销指定commit,后者的所有变化都被前者抵消,并且应用到当前分支
git revert [commit]

git 远程操作

git clone,git remote

// ssh,https,git,本地协议都支持,git协议下载最快
git clone [版本库url] [本地目录名:可选]

// git remote 用于管理主机名,不带选项的时候,git remote列出所有远程主机

git remote // origin 
// -v 选项可以查看主机网址
git remote -v
origin git@gitlab.xinyan.com:spider/SDK_H5.git (fetch)
origin git@gitlab.xinyan.com:spider/SDK_H5.git (push) 

// 克隆版本库的时候,所使用的远程主机自动被git命名为origin,如果想用其他的主机名,需要用git clone命令的-o选项指定
git remote -o jQuery htttps://github.com/jquery/jquery.git
git remote
jQuery

// 可以查看该主机的详细信息
git remote show <host-name> 
// 添加
git remote add <host-name> <url>

// 删除
git remote rm <host-name>
// 改名
git remote rename <old-name> <new-name>

git fetch

一旦远程主机的版本库有了commit更新, 需要将这些更新取回本地,用到git fetch <remote-host> git fetch命令通常用来查看其他人的进程,因为她取回的代码对你本地的开发代码没有影响。默认情况下,git fetch取回所有分支的更新。如果只想取回特定分支的更新,可以指定分支名:git fetch <remote-host> <branch-name>。所取回的更新,需要在本地主机上用<q style="-webkit-print-color-adjust: exact;">远程主机名/分支名</q>的形式读取。

git pull

取回远程主机某个分支的更新,再与本地的指定分支合并git pull <remote-host> <remote-branch>:<local-branch>。如果远程分支与当前分支合并,则冒号后面的部分可以省略:

git pull origin next

git fetch origin
git merge origin/next

在某些场合,git会自动在本地分支和远程分支之间,建立追踪关系tracking,比如在git clone的时候,所有本地分支默认与远程主机的同名分支建立追踪关系 也允许手动建立追踪关系:git branch --set-upstream master origin/next 如果当前分支远程分支存在追踪关系,git pull就可以省略远程分支名:git pull origin,如果当前分支只有一个追踪分支,连远程主机名都可以省略:git pull,上面命令表示,当前分支自动与唯一一个追踪分支进行合并。

如果远程主机删除了某个分支,默认情况下git pull的时候不会在拉取远程分支的时候删除对应的本地分支,是为了防止由于其他人操作了远程主机导致git pull不知不觉删除了本地分支,当然可以加上选项 -p就会在本地删除远程已经删除的分支:

git pull -p 
// or 
git fetch --prune origin
git fetch -p

git push

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

git push <remote-host> <local-branch>:<remote-branch>

分支推送的顺序是<from>:<to>git pull对应<remote-branch>:<local-branch>git push对应<local-branch>:<remote-branch>,如果省略远程分支名,则表示将本地分支推送与之存在“追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。git push origin master,上面命令表示将本地的master分支推送到origin主机的master分支。 如果省略本地分支名,则表示删除指定的远程分支,等同于推送一个空的本地分支到远程分支。

git push origin :master
// or 
git push origin --delete master

如果当前分之与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略:git push origin。 如果当前分支只有一个追踪分支,那么主机名都可以省略:git push

如果当前分支与多个主机之间存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push了: git push -u origin master。不带任何参数的git push默认只推送当前分支,叫做simple方式,此外还有一种matching方式 ,现在默认使用simple方式,如果要修改,采用git config --global push.default matching/simple,还有就是不管是否存在对应的远程分支,都会推送到远程主机,需要使用 --all选项:git push --all origin,如果要推送标签,要加上--tags选项:git push origin --tags

git 进阶

git 特点

近乎所有操作都只是本地执行

比如说要浏览项目的历史,git不需要外联到服务器去获取历史,只需要直接从本地数据库中读取。

git保证完整性

git中所有数据在存储前都计算校验和,然后以校验和来引用。意味着不可能在git不知情时更改文件内容或者目录内容。这个功能构建在git底层。是构成git哲学不可或缺的部分,如果在传输过程中丢失信息或者损坏文件,git就能发现。 git用以计算校验和的机制叫做SHA-1散列(哈希hash),他是一个由40个十六进制字符(0-9和a-f)组成字符串,基于git中文件的内容或者目录结构计算出来。

进阶部分不好整理,有点多,难度比较大,大家可以自己稍微看看我推荐的progit.zh.pdf 还有 git-scm中文文档,不过说到底git只是个工具,遇到问题可以及时解决就行。

提升效率的工具方面

其实自己手打也差不多, 可以利用之前提及的git config –list里面的alias,比如: git pl && git add . && git cm -m "commit message" && git ps; && 符号是说上一条命令执行成功才会执行下一条 Mac上有oh-my-zsh这个很方便的命令行alias全局配置工具,还有iterm2终端app, 参考下面的文章: item2安装及使用 oh-my-zsh安装 oh-my-zsh配置

我在项目里面配置了ci.sh 和 test.sh prd.sh 可以用于日常的提交代码,推送到test分支发布测试环境,推送到prd分支发布生产环境。windows的话推荐强大的Cygwin这里也有一篇有关Cygwin的短文,

windows上我找到这篇文章,特别短,主要是alias方面。

不过我觉得如果你的IDE自带终端还有git操作比较方便的话还是用IDE吧,不用命令行也可以。 如果用命令行的话,推荐git-bash这里有篇短文,推荐一下。

参考资料

书籍 文档 链接
progit.zh.pdf git-scm.com/book 阮一峰-常用git命令清单

郭南赐 2018.06.02

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

推荐阅读更多精彩内容