Git教程

Git教程

标签(空格分隔): Linux 版本控制 git 廖雪峰


廖雪峰的官方网站Git教程


git常用命令

git安装
sudo yum install git
检查git是否安装
git
创建版本库

mkdir learngit
cd learngit
git init # 初始化git
# learngit文件夹为版本库文件夹,git文件需要存放在此处

git使用

git用户和邮箱设置

git config --global user.email "Your email"
git config --global user.name "Your name"

添加文件
git add filename
上传文件
git commit -m "注释" # 会上传所有的add文件
查看文件当前状态
git status
文件对比
git diff filename
查看日志

git log 
commit 3628164fb26d48395383f8f31179f24e0882e1e0  # 文件唯一标识
Author: Michael Liao <askxuefeng@gmail.com>      # 修改者信息
Date:   Tue Aug 20 15:11:49 2013 +0800          

日志等单行显示
git log --pretty=oneline
版本回退

gir reset --hard HEAD^  # 回退上一个版本
gir reset --hard HEAD^^  # 回退上上个版本
gir reset --hard HEAD~100  # 回退100个之前的版本
## 在版本回退后,git log会失去现有版本的记录,只有回退版本之前的记录   -- ??

可以指定commit_id来回退任意版本的文件
git reset --hard 3628164

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向版本1,变更为版本2:

git reflog # 记录每一次命令,用于版本更改。

查看帮助&命令说明

git help
git help log # 查看单条命令的详细信息

git和其他版本控制的区别, 工作区和暂存处(重要)

工作区 Working Directory
版本库 Repository

.git目录 git的版本库
版本库中存放了stage的暂存区和分支master(git自动创建的第一个分支)以及指向master的一个指针叫HEAD.
概念:
    修改或者新增文件 --> 暂存区 --> master分支(通过HEAD指针)(提交完毕后,由于暂存区和工作区一致,所以工作区就是'干净的'

git管理的修改,其他svn管理的是文件

git和svn的差异 必须先add,再commit

由于git add 会将修改从工作处放到暂存处,
git cmomit将暂存处提交到版本库,如果不add,
就无法commit暂存处的文件。

可以多次add,然后一次性commit

撤销更改

git checkout -- readme.txt # 把文件在工作区的修改全部撤销 ## -- 必需,不然会便成为分支变更
将文件还原到最近一次git commit 或者跟git add的状态


# 当文件在工作区修改,未放到暂存处  文件恢复
git checkout -- readme.txt
# 当文件已经放到暂存区,但是未commit  文件恢复
git reset HEAD file 把暂存区的修改重新放回到工作区
git checkout -- readme.txt 把工作区的修改撤销
# 已经commit到了本地的版本库
版本回退即可,
如果已经提交到了远程服务器, ??? # 由于版本控制一般不允许修改版本库的日志

删除文件

git rm file_name # git删除
git commit -m "deltet_test" # 提交删除
git checkout -- test.txt # 恢复删除

使用Github远程仓库 —– 待完成

ssh-keygen -t rsa -C "youremail@example.com" # 创建SSH key  需要root用户,不然,无法得到私钥和公钥
### 可能需要将密钥拷贝到当前用户的根目录
  • 在Github网站中创建仓库后,将公钥贴到网站,详细见教程
  • 连接到远程仓库&推送文件到github
echo "# learngit" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/Scfan6435/learngit.git # 连接远程仓库 
git push -u origin master # 本地文件push到远程仓库上面去  

git push -f origin master # 强制合并  ????

git remote remove 删除远程分支
推送本地文件:git push origin master
小结:

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

从远程库中克隆

在github网站上搭建后
git clone git@github.com:michaelliao/gitskills.git # 克隆本地库
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

分支管理 – 复杂具体见教程

分支管理:分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
分支管理在svn等集中式版本管理中,创建很慢,但是在git中创建非常快。

主分支:master
HEAD指针指向master,来确定当前分支以及分支的提交点。当创建一个分支dev时,Git会新建一个指针dev,指向master相同的提交,再把HEAD指向新指针dev,就表示当前分支在dev.

创建分支

git checkout -b dev # -b 表示创建并切换
或
git branch dev
git checkout dev

查看当前分支

git branch # 列出当前的所有分支,当前分支会标注*

分支切换

git checkout dev # 分支名称

合并分支

git chenckout master # 切换到master
git merge dev # 将dev合并到master

删除分支

git branch -d dev # 合并完成后就可以删除分支了
小结:
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>

分支冲突

git log --graph --pretty=oneline --abbrev-commit # 查看分支的合并情况
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph命令可以看到分支合并图。

分支管理策略

合并分支时,git会默认使用Fast forward模式,但是这种模式下,删除分支信息。如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。--no-ff方式的git merge,禁用Fast forward模式

Bug分支

Bug分支:当当前工作内容完成一半时,有新的紧急的工作内容,需要将未完成的工作储存,并从master中获取新分支解决bug。

#### 储藏当前工作内容
git stash
git stash list # 查看储存信息
git stash apply stash_name # 恢复储存信息,不删除stash信息
git stash drop # 删除stash信息clone

git stash pop # 恢复stash并且删除stash

Feature分支 # 新功能分支

开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
git branch -d name # 删除
git brand -D name # 强制删除

多人协作

git remote # 查看远程库信息
远程仓库的默认名称为origin

git remotr -v # 查看详细信息

推送分支,把分支的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就把该分支推送到原仓库对应的远程分支上:
git push origin master

小结:
查看远程库信息,使用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,如果有冲突,要先处理冲突。

标签管理

标签管理:用于替代commit_id,用v1.2来表示。

创建标签

git branch # 切换到需要打标签的分支
git tag v1.0 # 对当前分支的最新commit打标签v1.0
git tag # 查看所有标签

对过去的版本打标签

git log –pretty=oneline –abbrev-commit # 寻找历史提交的commit id
git tag v0.9 xxxxxx

注:标签按照字母排序,而非时间排序
git show # 查看标签信息
git tag -a 版本号 -m “注释” commit_id

还可以通过-s用私钥签名一个标签: – 暂定

git tag -s v0.2 -m "signed version 0.2 released" fec145a
# 签名采用PGP签名,因此,必须首先安装gpg(GnuPG),如果没有找到gpg,或者没有gpg密钥对,就会报错: 如果报错,请参考GnuPG帮助文档配置Key。
命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

git tag -a <tagname> -m "blablabla..."可以指定标签信息;

git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

命令git tag可以查看所有标签。

因为标签只存储在本地,不会推送到远程,所以可以直接在本地安全删除。

删除标签: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 clone git@github.com:michaelliao/bootstrap.git # 克隆项目,

自定义Git

配置git颜色:git config --global color.ui true

配置忽略规则

忽略特殊文件:例如密码以及单独环境配置等文件

在工作区根目录 .gitignore文件中把要忽略的文件名填进去,Git会自动忽略这些文件

强制添加被忽略的文件:git add -f filename
检查文件被何种忽略规则忽略:git check-ignore-v filename
忽略文件的版本管理:.gitignore文件要被放到版本库中,并可以被管理。

配置别名

类似alias命令,命令别名。
配置别名

git config --global alias.st status  # 设置staus命令别名为st

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 config --global alias.unstage 'reset HEAD' # 暂存区的修改撤销
git config --global alias.last 'log -1' # 显示最后一次的提交信息
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" # 详细颜色配置

–global 参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。如果没有此参数,只针对当前的仓库起作用。
配置文件 .git/config

原文地址:https://www.cnblogs.com/superscfan/p/12257041.html