代码说

code is poetry

代码说    
碎碎念:开放留言!在文章页内容最后,点击“留言”按钮,就可以留言了。  换一换

git简明教程(廖雪峰)

作者:coderzheng 发布于:2016-4-7 10:58 Thursday 分类:other  阅读模式

本文根据廖雪峰撰写的git教程整理而来,原教程链接:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
#安装:
$yum install git #或者以tarball方式安装(略)
#在windows上安装成功之后, 最后要设置用户命和邮箱:
$git config --global user.name "Your name"
$git config --glabal user.email "email@example.com"
#创建版本库
$mkdir learngit 
$cd learngit
$pwd
$git init#切换到目标文件夹之后,再在目标项目文件夹下运行
#添加一个文本文件
$git add readme.txt 
$git commit -m "write a readme file"
git commit命令:
$git commit -m '说明'
$git add 可以同时接受多个参数
$git add file0
$git add file1 file2 file2
...
$git commit -m 'explaination'

#修改文件内容, 之后:
$git status # 查看当前仓库的状态
$git diff #查看具体修改的内容(和上一个版本相比)
$git diff HEAD -- readme.txt
#查看提交日志(默认看到的是最近三次的日志)
$git log  #更简洁清晰的查看方式
$git log --pretty=online #回到过去
#回退到上一个版本
$git reset --head HEAD^ #如果是回退到上上个版本,上一百个版本呢?
$git reset --head HEAD^^
$git reset --head HEAD~100
再次穿越
$git reset --head 3628164 #数字是之前在git log状态下观察到的数字 #版本号不需要写全,但是也不能写太少,至少要能区分出它是哪一个版本

#吃后悔药
$git reflog #在当前命令行窗口已经关闭的情况下, 你可以通过这种方式再次找回那个id #让文件回到最近一次git commit或git add时的状态
$git checkout -- readme.txt #撤销缓存区中的修改
$git reset HEAD readme.txt 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

#删除文件
$git rm test.txt
$git commit -m "remove test.txt"
#删错了怎么办?
$git checkout -- test.txt // 关联远程库(先有本地库, 后有远程库)
$git remote add origin git@github.com:micahelliao/learngit.git // 把本地库中的所有内容推送到远程库上
$git push -u origin master # 第一次推送时加-u参数, 会将本地master库和远程master库进行关联
$git push origin master
// 从远程库中克隆(先有远程库, 后有本地库)
git clone git@github.com:micahelliao/learngit.git // 创建与合并分支
创建dev分支, 切换到dev分支
$git checkout -b dev -b参数添加后相当与下面的两条命令:
$git branch dev
$git checkout dev
$git branch #查看当前分支
// 切换回master分支
$git checkout master // 合并分支
$git merge dev # 合并指定分支到当前分支 // 删除分支
$git branch -d dev
$git log --graph --pretty=online --abbrev-commit #查看分支历史
// 禁用fast forward进行合并
$git merge --no-ff -m "merge with no-ff" dev // 暂存一个状态分支
$git stash // 从状态中恢复
$git stash pop 或者用下面两条命令来代替:
$git stash apply
$git stash drop
// 强行删除一个未合并的分支
$git branch -d feature-vulvan // 查看远程仓库信息
$git remote
$git remote -v #查看更详细的信息
// 推送分支
$git push origin master #将本地的master推送到远程的origin // 从远程上抓取分支
$git pull #一个典型的远程协作开发示例:
$git clone source.git
$git branch # 此时默认只能看到master分支
$git checkout -b dev origin/dev # 在本地创建一个dev分支
之后在dev分支上做开发,提交修改之后push dev分支到远程
$git commit -m "add /user/bin/env"
$git push origin dev
但是,此时可能会产生冲突,因为其他成员在你push之前也提交了修改,怎么办?
先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
$git branch --set-upstream dev origin/dev
$git pull
#标签管理
$git branch
$git checkout master
$git tag v1.0 # 打标签咯
$git tag #查看所有标签
对没有及时打标签的版本重新打标签:
$git log --pretty=online --abbrev-commit #查看版本提交详情
$git tag v0.9 6224937 # commit id 是从上面这个命令中查看到的
$git show v0.9 # 查看标签下的提交详情(详情以字母顺序排列)
还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$git tag -a v0.1 -m "version 0.1 released" 3628164 用命令git show <tagname>可以看到说明文字:
还可以通过-s用私钥签名一个标签:
$git tag -s v0.2 -m "signed version 0.2 released" fec145a 用命令git show <tagname>可以看到PGP签名信息:
#操作标签
$git tag -d v0.1 推送标签到远程:
$git push origin <tagname> 或者,一次性推送全部尚未推送到远程的本地标签:
$git push origin --tags 上面删除标签的情况只有在标签没有推送到远程的情况下有效,如果已经推送到了远程,就要这样:
$git tag -d v0.9
$git push origin: refs/tags/v0.9
自定义git
#开启颜色显示
$git config --global color.ui true #显示颜色 #忽略特殊文件
利用.gitignore,自行编辑.gitignore文件的内容,然后提交它即可。
最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean。
使用Windows的童鞋注意了,如果你在资源管理器里新建一个.gitignore文件,它会非常弱智地提示你必须输入文件名,但是在文本编辑器里“保存”或者“另存为”就可以把文件保存为.gitignore了。
#使用别名
$git config --global alias.st status 示例:
$git config --global alias.co checkout
$git config --global alias.ci commit
$git config --global alias.br branch
#git 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" 所有配置都在配置文件中:
#每个仓库的git配置文件
$cat .git/config #当前用户的git配置文件
$cat .gitconfig #搭建git服务器
1) 安装
$tar -zxvf git-1.7.6.tar.gz
$./configure
$make && make install
2) 创建git用户
$sudo adduser git 3) 创建证书登录
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
4) 初始化git仓库
先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:
$sudo git init --bare sample.git Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$sudo chown -R git:git sample.git 5) 禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash 改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell 这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
6) 克隆远程仓库:
现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:
$git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。

管理权限
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。
这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。
























(全文完)

标签: git

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: 也谈工匠情怀  |  下一篇:使用js代码防止网页被其他站点用iframe引用