Git整理

1. 版本控制

CVS及SVN都是集中式的版本控制系统而Git是分布式版本控制系统。

  1. 集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
  2. 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,方便“交换”大家的修改。

2. 安装Git

在Mac OS X上安装Git,有两种安装Git的方法。

  1. 安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/
  2. 直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。安装了 XCode 集成了 git, 就可以直接在终端使用。
  • git版本
    git --version git version 2.11.0 (Apple Git-81)

  • 配置列表:
    git config --list
    注意: 当前路径的git配置

  • 在终端配置,安装完成之后需要在终端中配置一下

      $git config --global user.name "your name"
      $git config --global user.email "your email"
    

    注意: git config 命令的--global 参数,使用这个参数表示当前使用的这台机器上的 git 仓库都会使用这个配置,当然可以对某个参数指定不同的username 和 email。
    每个仓库的Git配置文件都放在.git/config文件中
    cat .git/config 当前仓库配置
    cat .gitconfig 主目录下 用户配置

git config --global alias.st status 配置别名(删除,进入配置文件删除)
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"

3. 创建版本库

版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里 面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

1.创建一个目录 并进入到该目录下

mkdir test
cd test

2.初始化这个目录,变成可以管理的仓库

git init

3.添加文件到Git仓库,分两步:
第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
git add . ("."表示添加当前目录下所有的可提交的文件)
第二步,使用命令git commit,完成。
git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
4.工作区和暂存区
工作区:电脑里能看到的目录,比如我的git文件夹。
版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
暂存区:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)。
git add把要提交的所有修改添加到暂存区。
git commit把暂存区的所有内容提交到当前分支。
git status命令可以让我们时刻掌握工作区当前的状态,告诉你有文件被修改过。
git diff可以查看工作区的修改内容。
5.日志记录

  • 查看提交历史,以便确定要回退到哪个版本:
    git log命令显示从最近到最远的提交日志(当前到最远的记录,如重返过去)。
    如果输出的信息太多,可以加上 --pretty=oneline 参数。
    显示的 hash 值太长可以加上 --abbrev-commit 。
    需要查看历史合并记录 加上 --graph。
    git log --abbrev-commit --pretty=oneline --graph
  • 查看命令历史,以便确定要回到未来的哪个版本(重返未来)
    Git提供了一个命令用来记录你的每一次命令:git reflog

6.版本回退穿梭

Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,上一个版本就是HEAD^, 上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示。

7.撤销修改

  • git checkout -- file可以丢弃工作区的修改
    一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
    一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
  • git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,(分支管理)。
  • git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区
    用命令git add告诉Git,把文件添加到仓库:
  • 没提交远程之前,版本回退。

4. 远程仓库

  • GitHub仓库(免费托管的Git仓库,任何人都可以看)
    1.本地Git仓库和GitHub仓库之间的传输是可以通过SSH加密的。
    2.Https
    第1步:创建SSH Key。ssh-keygen -t rsa -C "youremail@example.com"
    顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
    第2步: 对接GitHub。
  • Team Foundation Server(tfs)
    本地Git仓库和tfs仓库之间的传输也是可以通过SSH加密的。
  • 自己搭Git服务器

5. 添加远程仓库

在本地的xxx仓库下运行命令:
https:
git remote add origin2 https://github.com/JinXiangHuang/xxx.git
SSH密钥对(速度最快):
git remote add origin git@github.com:JinXiangHuang/xxx.git
branch.master.remote=origin 远程仓库名
branch.master.merge=refs/heads/master 支线

  • 推:
    关联后,把本地库的内容推送到远程,使用命令git push -u origin master第一次推送master分支的所有内容到远程;

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

    此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。

  • 拉:
    默认情况下 git pull 只会抓取远程最新的代码,并不会合并到当前分支。
    我们希望每次 git pull如果有最新的希望直接帮我们合并到当前的分支,打开配置文件, vi .git/config 最后面添加branch "master"
    remote = origin
    merge = refs/heads/master
    也可添加其他分支,但是即使添加多个分支,git 只会帮我们合并当前分支,其他分支需要手动合并 git merge origin/develop

  • 从远程克隆
    git clone git@github.com: JinXiangHuang/xxx.git

示例1:先创建远程库,然后,从远程库克隆。
1.git clone git@github.com:JinXiangHuang/someFiles.git
2.add commit ...
3.命令git push -u origin master第一次推送master分支的所有内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
示例2:先有本地库(是否有README.md),后有远程库的时候,如何关联远程库。

error: failed to push some refs to 'git@github.com:JinXiangHuang/someFiles.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
需要echo,add README.md

echo "# someFiles" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/JinXiangHuang/someFiles.git
git push -u origin master

6. 创建与合并分支

git checkout命令加上-b参数git checkout -b dev表示创建并切换,相当于以下两条命令:
创建:git branch dev
切换:git checkout dev
查看分支:git branch,列出所有分支,当前分支前面会标一个*号
把dev分支的工作成果合并到master分支上:
合并指定分支到当前分支:git merge dev
删除dev分支:git branch -d dev
强行删除:git branch -D <name>
重命名分支:git branch -m dev develop2
删除远程分支:git push origin --delete develop2

解决冲突:Automatic merge failed; fix conflicts and then commit the result.!!!!!
Git告诉我们,xxx文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件。
用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
切换分支,分支提交,切换主支主支提交后,存在冲突。
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
分支的合并情况:
git log --graph --pretty=oneline --abbrev-commit
git log --pretty=oneline --abbrev-commit

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
合并分支时,加上--no-ff参数就可以用普通模式合并表示禁用Fast forward,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

Bug分支:
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
git stash,把当前工作区“储藏”起来。
git stash list多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash
git stash apply恢复一恢复后,stash内容并不删除,你需要用git stash drop来删除;
git stash pop恢复的同时把stash内容也删了.

git push origin dev git push origin xxx
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

7. 标签

git tag v2切换到需要打标签的分支上,git tag xxx就可以打一个新标签.默认标签是打在最新提交的commit上的。
git tag -a v0.1 -m "version 0.1 released" 3628164创建带有说明的标签,用-a指定标签名,-m指定说明文字。
git tag查看所有标签.
git show v2查看标签信息。
git push origin <tagname>可以推送一个本地标签;
git push origin --tags可以推送全部未推送过的本地标签;
git tag -d <tagname>可以删除一个本地标签;
git push origin :refs/tags/<tagname>可以删除一个远程标签。

相关

显示隐藏文件 defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder
不显示隐藏文件 defaults write com.apple.finder AppleShowAllFiles No && killall Finder
建议用命令复制ssh key,用文本软件打开有可能出错!
mac
pbcopy < ~/.ssh/id_rsa.pub
windows
clip < ~/.ssh/id_rsa.pub
linux
sudo apt-get install xclip
xclip -sel clip < ~/.ssh/id_rsa.pub

No such file or directory 创建SSH Key:
ssh-keygen -t rsa -C "youremail@example.com"
用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥

如何把项目托管到GitHub

在github上面建立空的仓库(repositories)

Initialize this repository with a README 表示在初始化仓库的时候,是否生成一个readMe文件。我们在查看别人框架的时候,在框架主页上会有对该框架版本信息,作用使用方法等等的介绍,这个文件就是readMe文件,在这里选择勾上。

Add .gitignore按钮,点击之后会出现一个下拉框,问你是否要设置仓库的忽略文件。这个看你自己的需要,通常如果你的仓库和代码项目有关系,那么最好选择相应的忽略文件(如OC项目可以选择Object-C,swift项目可以选择Swift),至于为什么请参考GIT的基本使用。

Add a license按钮,点击之后会出现一个下拉框,需要你选择一种开源协议,开源协议有很多种用的比较多的有MIT的或者是Apache的,不同的开源协议对项目的使用方式等有不同的规定,详情可以参考Choose an open source license

廖雪峰的官方网站
Git官网
Git权威指南电子版下载地址
https://git-scm.com/book/zh/v2

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

推荐阅读更多精彩内容