GIT命令

我目前用的代码管理工具是SourceTree,而且还是中文版,工具的好处就是简单直观,各有各的好处. 朋友的笔记存放在这,以便以后学习!!


git常用的一些命令:

配置全局git的邮箱和用户名:

git config --global user.email “****@163.com"

git config --global user.name “***"

配置局部邮箱和用户名:

git config “user.name” [用户名]

git config “user.email” [用户邮箱]

创建一个仓库:git init

新创建文件提交到暂缓区:git add .(把当前文件夹下所有文件都提交到stage中去)

暂缓区中文件的变化提交到master中:git commit -m “版本控制信息"

查看提交记录:git log(git log模式下,按`q`可退出git log模式)

查看当前提交状态:git status, 如果文件都是绿色的则代表可以使用commit命令提交了.

查看当前git版本:git--version

查看指令使用记录:git reflog

从远程仓库克隆代码(将远程库clone到本地):git clone git@github.com:michaelliao/gitskills.git

关联远程仓库(本地git库和远程库关联):git remote add origin git@server-name:path/repo-name.git

第一次推送分支内容:git push -u origin master

此后推送分支内容:git push origin master

其它命令:

查看一个文件全部内容: cat [filename]

创建一个文件: cat > [filename]

svn属于集中式的版本控制软件, 就是说所有的项目版本信息全部保存在服务器端.

git属于分布式的版本控制软件, 版本信息既可以保存在远程服务端, 也可以保存在客户端, 如果说服务端挂了, 那么通过本地的版本信息同样可以恢复历史版本.

多数情况下git的速度会比svn快;

svn创建分支比较笨拙, git可以方便的建立无限个分支;

使用git管理版本时候, 一般项目下会有一个.git隐藏文件夹, git的工作分为版本库(.git文件夹)和工作区(其它目录).

如下图所示, 表示git工作流程, 在git版本库中, 有一个称谓stage的暂缓区, master相当于最终的管理仓库.

git commit命令作用是把stage中的变化更新到master中去, 如果是新建的stage中没有的文件, 需要添加到stage中(git add . 把当前目录所有文件都添加到stage中去)


git工作流程

1.从服务器端获取代码(clone), 我们习惯称之为克隆;

2.修改代码后提交到本地;

3.当有需要的时候提交代码到服务器;

git基本操作命令

创建一个仓库: git init

初始化项目, 在项目中添加几个文件;

新创建的文件需要添加到暂缓区中:git add .(use "git add ..." to include in what will be committed)

提交项目到版本控制:git commit -m “版本说明信息"

如果修改了文件, 那么也是不能直接提交的, 也需要通过`git add .`命令将变化更新到暂存区stage中, 然后才能通过git commit命令提交变化到master中去.

版本回退

回退到上一个版本:git reset --hard HEAD^

回退到前两个版本:git reset --hard HEAD^^

回退到前N个版本:git reset --hard HEAD~N  //N是一个数字

回退到指定版本:git reset --hard [版本号]  //版本号可通过git reflog查看, 一般是七位的字符

(use "git add ..." to update what will be committed)

(use "git checkout -- ..." to discard changes in working directory)

git status命令用于查看当前状态, git diff用于查看当前变化

撤销修改

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- [file]。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD [file],就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

git checkout . //撤销当前工作区所有的修改

删除文件

git rm [文件名]

执行完上述命令, 需要将变化commit到master

配置用户名和邮箱

全局和局部的用户名和邮箱

全局: 默认一个git仓库如果没有配置用户名和密码就使用全局的;

局部: 紧针对本项目才有效;

.git/config  //此文件存储git本地仓库配置信息, 包含用户名和邮箱的配置

//配置本地(局部)用户名和密码和全局的用户名密码区别就是少可一个`--global`

git config “user.name” [用户名]

git config “user.email” [用户邮箱]

日志格式

个性化的日志格式可以参考:https://segmentfault.com/a/1190000000307435

远程仓库

git支持远程仓库, 可以自己搭建git服务器进行版本管理, git是一个分布式的版本控制系统, git支持ssh加密.

比如github, 我们在使用github时候, 是需要配置公钥的, 因为是加密传输嘛, 好处是, 配置之后会使用私密传输, 只有你自己才能上传, 当然, git系统支持添加多个公钥, 这样, 如果你有多台电脑, 可以同时在不同的设备上同步.

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

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

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容

从远程仓库clone:git clone git@github.com:michaelliao/gitskills.git

要克隆一个仓库, 必须知道远程仓库的地址, 然后使用git clone命令进行克隆操作.

git支持多种协议, 包括ssh协议和https协议(https协议缺点是速度慢, 每次推送必须输入口令; ssh支持原生git协议, 速度快, 方便)

关联远程仓库:git remote add origin git@server-name:path/repo-name.git

使用如上命令可以将本地已有的仓库和远程服务器仓库进行关联. `git remote add origin`命令

第一次推送分支所有内容:git push -u origin master

第一次提交加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令

此后每次本地提交后, 只要有必要, 就可以使用`git push origin master`命令, 将最新的版本推送到远程服务器.

分支管理

分支相当于是一个平行宇宙, 比如有两个人在同时做同一个项目, A做一个分支, B创建一个分支, A/B在自己的分支上提交代码, 当两个人都写差不多时候, 可以去合并分支, 将两个人的代码合在一起.

Bug分支

有这样一个场景, 你正在敲代码, 但是软件出现一个紧急bug需要修改, 需要在以前的版本上修改, 而要求必须两个小时内改好, 当前工作还要两天才能完成,才能提交, 入如果提前提交, 可能影响到别人工作, 导致程序不可用, 这时候可以使用bug分支, 临时创建一个分支, 在分支上修改bug之后, bug分支和master分支合并, 最后返回到正在开发的分支上去, 退出临时分支, 开始接着敲代码.

1.把当前未提交的工作区保存下来, 使用如下命令

git stash

Saved working directory and index state WIP on dev: 6224937 add merge

HEAD is now at 6224937 add merge

2.比如需要在master分支上修复bug, 则创建一个master的分支, 在分支上修复bug, 如下命令, 切换到`master`分支上去

git checkout master

3.创建并切换到分支`issue-101`

git checkout -b issue-101

4.修改bug之后, 将更改添加到git仓库中, 并提交到仓库中

git add .

git commit-m"fix bug 101"

5.修复完成之后, 切换到master上去, 合并分支, 并删除原来的`issue-101`分支

git checkout master   //切换到master

git merge--no-ff-m"merged bug fix 101"issue-101  //合并分支

git branch-d issue-101  //删除`issue-101`分支

6.最后切换到工作的分支上, 恢复刚才保存下来的未提交的内容, 继续撸,狠狠橹

git checkout dev   //切换到当前开发分支上

git stash list  //可以多次使用`git stash`保存为提交的工作变化, 此命令查看所有的保存的记录

git stash apply   //git stash apply stash@{0} 恢复到指定的保存版本中, 恢复后`stash`内容并不删除

git stash drop   //删除stash

git stash pop  //恢复的同时删除stash内容

feature分支

软件开发完了, 但是产品又来添加新的功能模块, 这时候, 最好在新的分支上来做新的工作, 创建新的分支->撸代码>合并, 和bug分支的管理是类似的, 但是突然某种原因不需要这个心功能了, 并且要求全部删除, 可能会删除失败.

git branch-d // 如果分支没有合并直接删除, 不能直接删除, 必须强制删除才行.

git branch-D //强制删除分支命令

创建和合并分支

查看分支:git branch     //git branch命令会列出所有分支,当前分支前面会标一个*号。

创建分支:git branch

切换分支:git checkout

创建+切换分支:git checkout -b

合并某分支到当前分支:git merge  --no-ff (—no-ff,表示重新生成新的合并,而不是移动head指针)

删除分支:git branch -d

删除远程分支:git push origin --delete [branch]

查看远程仓库:git branch -a

正常的git使用流程: 在服务器上创建master分支, clone到本地, 在本地创建dev分支用于平时的开发, 如果开发完了某一模块则将dev分支合并到master上去, 在master分支上提交代码到服务器中.

分支管理策略:

Fast forward: 表示在merge分支时候, 如果可以通过直接移动head指针来达到最新的版本, git系统会默认使用此模式.

--no-ff: 表示禁用Fast forward, Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。


git分支非常强大, 在实际开发中应该充分利用.

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

多人协议

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

用git remote -v显示更详细的远程仓库信息.

git push origin dev  推送本地分支到仓库.

并不是所有的分支都需要被推送到服务器, 一般情况下, master必须被推送, dev分支一般也会被推送, 自己开发的分支就不必须被推送了.

因此,多人协作的工作模式通常是这样:

首先,可以试图用git push origin branch-name推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。

小结:

查看远程库信息,使用git remote -v;

本地新建的分支如果不推送到远程,对其他人就是不可见的;

从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

解决冲突

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容

一种好看的方式查看git分支合并:git log--graph--pretty=oneline--abbrev-commit

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

用git log --graph命令可以看到分支合并图。

tag标签

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。

所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

创建标签

1.创建: git tag   //git tag v1.0.0

2.查看所有的标签: git tag

3.给指定的某个HEAD打标签: git tag v0.9 6224937

4.查看标签信息:git show

5.指定标签信息:git tag -a -m "blablabla..."

操作标签

创建的标签只会存储在本地, 不会自动的推送到服务器, 所以打错的标签可以在本地安全的删除.

删除标签:git tag -d v0.1

推送本地标签到远程:git push origin

推送本地所有的标签到远程:git push origin --tags

如果标签已经推送到远程, 删除步骤:

方法一:

删除远程tag:git push origin --delete tag

方法二:

1.在本地删除指定标签:git tag -d v0.1

2.删除服务器上的标签:git push origin :refs/tags/v0.9

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

推荐阅读更多精彩内容