<p>Git教程简介</p><p>1,在Linux上安装Git</p><p>首先,你可以试着输入git,看看系统有没有安装Git:</p><p>$ git</p><p>The program 'git' is currently not installed. You can install it by typing:</p><p>sudo apt-get install git</p><p>$ git config --global user.name "Your Name"</p><p>$ git config --global user.email "email@example.com"</p><p>2,创建版本库</p><p>通过git init命令把这个目录变成Git可以管理的仓库:</p><p>$ git init</p><p>Initialized empty Git repository in /Users/michael/learngit/.git/</p><p>3,添加文件到Git仓库,分两步:</p><p>使用命令git add <file>,注意,可反复多次使用,添加多个文件;</p><p>使用命令git commit -m <message>,完成。</p><p>4,版本回退</p><p>$ git reset --hard HEAD^ 回退到上一个版本</p><p>git log</p><p>$ git reset --hard 1094a 可以指定回到未来的某个版本</p><p>5,工作区和暂存区</p><p>提交后,用git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别:</p><p>6,撤销修改</p><p>git checkout -- file可以丢弃工作区的修改:</p><p>git checkout -- file命令中的--很重要,没有--,就变成了"切换到另一个分支"的命令</p><p>git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:</p><p>场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。</p><p>场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。</p><p>场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。</p><p>7,删除文件</p><p>命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。</p><p>$ git rm test.txt</p><p>rm 'test.txt'</p><p>$ git commit -m "remove test.txt"</p><p>HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。</p><p>穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。</p><p>要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。</p><p>8,添加远程库</p><p>git remote add origin git@192.168.200.21:/home/gittest/two/.git</p><p>$ git remote add origin git@github.com:michaelliao/learngit.git</p><p>添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。</p><p>下一步,就可以把本地库的所有内容推送到远程库上:</p><p>$ git push -u origin master</p><p>把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。</p><p>9,从远程库克隆</p><p>$ git clone git@github.com:michaelliao/gitskills.git</p><p>注意把Git库的地址换成你自己的,然后进入gitskills目录看看,已经有README.md文件了:</p><p>要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。</p><p>Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。</p><p>10,创建与合并分支</p><p>$ git branch dev 创建分支</p><p>$ git checkout dev 切换分支</p><p>git branch命令查看当前分支:</p><p>$ git merge dev 合并分支</p><p>$ git branch -d dev 删除分支</p><p>查看分支:git branch</p><p>创建分支:git branch <name></p><p>切换分支:git checkout <name></p><p>创建+切换分支:git checkout -b <name></p><p>合并某分支到当前分支:git merge <name></p><p>删除分支:git branch -d <name></p><p>Git鼓励大量使用分支:</p><p>查看分支:git branch</p><p>创建分支:git branch <name></p><p>切换分支:git checkout <name></p><p>创建+切换分支:git checkout -b <name></p><p>合并某分支到当前分支:git merge <name></p><p>删除分支:git branch -d <name></p><p>12,创建标签</p><p>命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;</p><p>命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;</p><p>命令git tag可以查看所有标签。</p><p>13,操作标签</p><p>命令git push origin <tagname>可以推送一个本地标签;</p><p>命令git push origin --tags可以推送全部未推送过的本地标签;</p><p>命令git tag -d <tagname>可以删除一个本地标签;</p><p>命令git push origin :refs/tags/<tagname>可以删除一个远程标签。</p><p>14,忽略特殊文件</p><p>忽略某些文件时,需要编写.gitignore;</p><p>.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!</p><p>假设你在Windows下进行Python开发,Windows会自动在有图片的目录下生成隐藏的缩略图文件,如果有自定义目录,目录下就会有Desktop.ini文件,因此你需要忽略Windows自动生成的垃圾文件:</p><p># Windows:</p><p>Thumbs.db</p><p>ehthumbs.db</p><p>Desktop.ini</p><p>然后,继续忽略Python编译产生的.pyc、.pyo、dist等文件或目录:</p><p># Python:</p><p>*.py[cod]</p><p>*.so</p><p>*.egg</p><p>*.egg-info</p><p>dist</p><p>build</p><p>加上你自己定义的文件,最终得到一个完整的.gitignore文件,内容如下:</p><p># Windows:</p><p>Thumbs.db</p><p>ehthumbs.db</p><p>Desktop.ini</p><p># Python:</p><p>*.py[cod]</p><p>*.so</p><p>*.egg</p><p>*.egg-info</p><p>dist</p><p>build</p><p># My configurations:</p><p>db.ini</p><p>deploy_key_rsa</p><p>最后一步就是把.gitignore也提交到Git,就完成了!当然检验.gitignore的标准是git status命令是不是说working directory clean。</p><p>15,配置别名</p><p>有没有经常敲错命令?比如git status?status这个单词真心不好记。</p><p>如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。</p><p>我们只需要敲一行命令,告诉Git,以后st就表示status:</p><p>$ git config --global alias.st status</p><p>好了,现在敲git st看看效果。</p><p>当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:</p><p>$ git config --global alias.co checkout</p><p>$ git config --global alias.ci commit</p><p>$ git config --global alias.br branch</p><p>配置文件</p><p>配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。</p><p>配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:</p><p>$ cat .git/config</p><p>[core]</p><p> repositoryformatversion = 0</p><p> filemode = true</p><p> bare = false</p><p> logallrefupdates = true</p><p> ignorecase = true</p><p> precomposeunicode = true</p><p>[remote "origin"]</p><p> url = git@github.com:michaelliao/learngit.git</p><p> fetch = +refs/heads/*:refs/remotes/origin/*</p><p>[branch "master"]</p><p> remote = origin</p><p> merge = refs/heads/master</p><p>[alias]</p><p> last = log -1</p><p>别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。</p><p>而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:</p><p>$ cat .gitconfig</p><p>[alias]</p><p> co = checkout</p><p> ci = commit</p><p> br = branch</p><p> st = status</p><p>[user]</p><p> name = Your Name</p><p> email = your@email.com</p><p>配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。</p><p>16,搭建Git服务器</p><p>第一步,安装git:</p><p>$ sudo apt-get install git</p><p>第二步,创建一个git用户,用来运行git服务:</p><p>$ sudo adduser git</p><p>第三步,创建证书登录:</p><p>收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。</p><p>第四步,初始化Git仓库:</p><p>先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:</p><p>$ sudo git init --bare sample.git</p><p>Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:</p><p>$ sudo chown -R git:git sample.git</p><p>第五步,禁用shell登录:</p><p>出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:</p><p>git:x:1001:1001:,,,:/home/git:/bin/bash</p><p>改为:</p><p>git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell</p><p>这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。</p><p>第六步,克隆远程仓库:</p><p>现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:</p><p>$ git clone git@server:/srv/sample.git</p><p>Cloning into 'sample'...</p><p>warning: You appear to have cloned an empty repository.</p><p>剩下的推送就简单了。</p><p>git remote remove test</p><p>git pull origin master:master</p>