Git

Git是现在非常流行的版本控制软件,同类软件的有svn。Github是流程的git仓库host网站,国内也有很多git host网站,例如git@OSC。这里有一份很好的教程

1. 安装使用

Windows下安装git

Windows下推荐使用github做的git for windows,最近的版本是2.15.0,下载之后直接安装,安装选项(没有涉及到的选项按默认的来):

  • Select components默认选择即可,如果需要可以勾上Use a Turetype font in all console windows,其它默认。
  • Adjusting your PATH environment选择Use Git from the Windows Commond Prompt
  • Configuring the line ending conversions选择Checkout as-is, commit as-is,不改变git检出和提交的数据。
  • Configuring the terminal emulator to use with Git Bash,选择Use Windows' default console window,这样nodejs等程序可以正常运行。推荐使用Windows 10。
  • Configuring extra options勾选上Enable symbolic links

Linux下安装git

对于CentOS 6,执行yum install git安装git。最好推荐升级到最新版本:

yum install http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm
yum install git

生成ssh公钥并添加到github

进入Git Bash,执行ssh-keygen,一路回车完成。然后将C:\Users\用户名\.ssh\id_rsa.pub(windows)或~/.ssh/id_rsa.pub(linux)里面的内容贴到github的ssh keys配置中。

2. 常用命令

配置自己的用户名和邮箱,每个git都推荐单独制定:

git config user.name pugwoo # 加上--global则是全局指定
git config user.email pugwoo@gmail.com

对于国外的github或bitbucket,如果比较慢,可以设置代理,支持http或socks5:

git config --global http.proxy http://proxyuser:proxypwd@proxy.server.com:8080

取消设置代理:

git config --global --unset http.proxy

检出代码,推荐使用ssh公钥的方式拉代码:

git clone git@github.com:pugwoo/j2se.git #如果提示输入yes/no,输入yes

添加文件到版本控制范围:

git add 文件名
git add -A # 添加所有文件
git add . # 添加当前文件夹所有文件,常用

删除文件(文件夹):

git rm 文件名 # 多个文件名用空格隔开
git rm -r 文件夹名
# 如果不想git把本地的文件删除掉,则加上--cached 选项

查看当前本地被修改但还没有提交的文件,包括新增、修改、删除的文件和文件夹:

git status # 如果没有修改会提示没有修改

查看本地未提交的文件的修改

git diff HEAD

提交修改到本地repo:

git commit -m "说明"
git commit -a -m "说明" # 使用-a选项将本地的修改文件直接提交,不用先执行git add了

查看本地git日志:

git log

从远程拉代码并合并到本地:

git pull

将“本地代码提交”提交到远程repo,执行之前记得git status看下修改的文件并git add .添加到commit范围再git commmit -m "msg"

git push

显示本地设置的远程remote repo:

git remote -v

关于清除本地修改的命令

还原本地修改:

git checkout .

删除本地生成的,没有纳入git索引范围的文件:

git clean -f # 可以指定特定文件,没有指定则是全部untracked文件
git clean -f -d # 可以指定文件夹,没有指定则是全部untracked文件

3. 分支相关命令

branches模型

显示分支:

git branch # 查看本地分支(带星号的是当前分支)
git branch -a # 查看本地和远程所有分支

创建一个新分支,基于当前的分支:

git branch 新分支名称

切换分支:

git checkout 分支名称

假设你现在基于远程分支”origin”,创建一个叫”mywork”的分支:

git checkout -b mywork origin

从当前分支检出一个新分支并切换到该新分支:

git checkout -b 新分支名称

注:git创建的分支和svn创建的分支一个不同点:git的分支会把原分支的所有log加在当前分支上,看起来当前分支就好像从第一次提交到现在一样;而svn则看不到原分支过去的log记录,所以svn每次合并要看同一个文件的修改记录就很麻烦。

删除分支:

git branch -d 分支名称
git branch -D 分支名称  #(这个是无论分支是否合并到主干都删除)
git push origin :Branch1   #在github远程端删除一个分支,(分支名前的冒号代表删除)

将b分支合并到当前分支:

git merge b

将本地分支推送到远程(本地和远程的分支是对等的,名称相同,不能由本地的A分支提交到远程B分支。):

git push -u origin feature_branch_name
git push --set-upstream origin feature_branch_name # 加上--set-upstream后就不用每次都打git push origin Branch1,而是直接git push即可
git push --all -u  # 将所有分支都push到远程

关于rebase和merge的区别: git pull默认是merge的方式,merge会将两条分支合并并新建一个新节点,看起来就是两条分支合并成一条。rebase则将另一条分支的修改点整入到当前分支,看起来就像一条分支,没有合并。

参考这篇博客,如果你想让”mywork”分支历史看起来像没有经过任何合并一样,你也许可以用:

git rebase:
git checkout mywork
git rebase origin

更多的文档参考:Git分支的创建与合并

关于TAG分支

git tag # 列出所有的tag
git tag -l 1.* # 搜索tag
git tag v1.0 # 添加tag
git tag -a v1.0 -m "日志" # 添加tag
git tag -a v1.1 8a5cbc2 # 为之前的commit添加tag,commit的标志是log commit的前缀
git tag -d v1.0 # 删除tag
git push origin --tags # 将本地的tag上传到远程

4. github创建项目

创建github项目时,推荐选择Initialize this repository with a README并选择好编程语言设置好.ignore,就可以git clone出项目。

如果想自己初始化项目,则不选择初始化,然后提交到远程:

mkdir tmp
cd tmp
echo # justtest >> README.md # 新建一个文件
git init # 初始化git
git add README.md # 将文件加入到git仓库
git commit -m "first commit" # 提交到本地仓库
git remote add origin https://github.com/pugwoo/justtest.git # 添加远程仓库 
git push -u origin master # 将本地仓库推送到远程,下次就只用git push

对于github而言,它是一个版本控制的文件系统,并不关心里面的内容是项目还是文本。所以一个github repo下,是只有一个项目,还是每个目录一个项目,还是更深的结构关系,对于github来说都是不关心的。

github repo下创建一个maven项目

首先根据上面命令,把github的repo检出到本地的一个目录中。

然后根据Maven执行命令创建一个jar或war的项目,可以新增一个目录新建,或者在github根目录新建。

然后根据上面命令,将maven生成的文件上传到github上。

5. git ignore文件

该文件可以指定哪些文件git可以忽略掉不纳入版本控制,常用的ignore文件内容:

忽略点号.开头的文件

.*
!/.gitignore

6. 创建git服务器

实际上,服务器端并没有执行git的任何服务器程序,git客户端只需要.git即可。

无论是新的git还是gitclone出来的已有git,假设当前目录A下有.git目录,那么在目录A的父目录执行:

git clone --bare A A.git

就可以创建出一个A.git的文件夹,这个文件夹即服务端数据。

或者是直接创建一个服务端.git文件夹:

mkdir a.git
cd a.git
git init --bare

对于客户端,相当于登录上服务器使用数据文件,执行:

git clone 用户名@服务器:/path/to/A.git

7. 常用问题

备份github或bitbucket上的repo,删除github上repo后再还原

先把远程repo地址加入到remote中,然后push:

git remote add bit2 git@bitbucket.org:pugwoo/test.git
git push bit2 --all #
git push bit2 --tags # 

第一次提交git push时,出现No refs in common and none specified; doing nothing.

解决:执行git push origin master

github上和fork的源仓库保持同步

进入自己的仓库,点击Compare按钮,选择左侧为自己的仓库,右侧为fork的源仓库,然后create pull request,再自己合并自己的pull request即可。

文档更新时间: 2018-11-10 22:45   作者:nick