1、先去正规网站下载Git:Git下载链接>>>;
2、安装步骤见网站,各种环境的安装>>>,或者百度安装步骤;
3、TortoiseGit(Git小乌龟),用过svn的同学都知道有个svn小乌龟操作界面,Git也有,安装见百度;
4、安装好后见图:
下载完毕后,配置`path`环境变量,`E:\develop\git\Git\bin`(我本机的在E盘下)。
首先,登录GitLab,创建一个新项目的私人仓库:

然后,在本地仓库(就是你写代码文件夹),右键,Git Bash Here,打开Git命令窗口:

在Git命令窗口输入 git init,初始化本地仓库,初始化完成后,本地仓库文件夹中会出现一个.git文件夹,证明该仓库 已经被git管理了:

按照如下步骤,添加远程仓库地址,并提交代码:
- git add -A src //把src文件夹提交到远程仓库;
- git commit -m "首次提交代码,ssm整合" //把代码提交到本地仓库,并备注信息;
- git remote add origin 仓库地址 //设置远程仓库地址;
- git push -u origin master //提交代码到远程仓库,master分支;

获取远程仓库地址:

当提交代码时,可能出现如下错误:

说明你提交的仓库 origin不存在,我犯的错误是把origin单词拼写错误,导致前后输入命令时找不到该远程仓库,所以提交失败,可以使用使用以下命令解决该问题:
- git remote -v //查看远程仓库详细信息,可以看到仓库名称
- git remote remove orign //删除orign仓库(我把origin拼写成orign,删除错误名称仓库)
- git remote add origin 仓库地址 //重新添加远程仓库地址
- gti push -u origin master //提交到远程仓库的master主干
按照如上步骤操作,即可完成本地仓库使用git初始化,并提交到远程仓库。
SSH key的配置基本是我们使用git必备的配置,配置好可以避免频繁的在git push或者git pull的时候输入账号和密码。
- https://github.com/xiangshuo1992/preload.git
- git@github.com:xiangshuo1992/preload.git
这两个地址展示的是同一个项目,但是这两个地址之间有什么联系呢?
前者是https url 直接有效网址打开,但是用户每次通过git提交的时候都要输入用户名和密码,有没有简单的一点的办法,一次配置,永久使用呢?当然,所以有了第二种地址,也就是SSH URL,那如何配置就是本文要分享的内容。
GitHub配置SSH Key的目的是为了帮助我们在通过git提交代码是,不需要繁琐的验证过程,简化操作流程。
SSH key的配置步骤是比较简便的,分为5步:
1、设置git的user name和email
2、检查是否存在SSH Key
3、获取SSH Key
4、GitHub添加SSH Key
5、验证和修改
1、设置git的user name和email
如果你是第一次使用,或者还没有配置过的话需要操作一下命令,自行替换相应字段。
- git config --global user.name "username"
- git config --global user.email "username@gmail.com"
说明:git config --list 查看当前Git环境所有配置,还可以配置一些命令别名之类的。
2、检查是否存在SSH Key
- cd ~/.ssh
- ls
- 或者
- ll
- //看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key
如下图:

如果没有SSH Key,则需要先生成一下:
ssh-keygen -t rsa -C "username@gmail.com"
执行之后继续执行以下命令来获取SSH Key:
- cd ~/.ssh
- ls
- 或者
- ll
- //看是否存在 id_rsa 和 id_rsa.pub文件,如果存在,说明已经有SSH Key
3、获取SSH Key
- cat id_rsa.pub
- //拷贝秘钥 ssh-rsa开头
如下图:

4、GitHub添加SSH Key
GitHub点击用户头像,选择setting:

新建一个SSH Key:


取个名字,把之前拷贝的秘钥复制进去,添加就好啦。

5、验证和修改
测试是否成功配置SSH Key。
- ssh -T git@github.com
- //运行结果出现类似如下
- Hi ! You've successfully authenticated, but GitHub does not provide shell access.
之前已经是https的链接,现在想要用SSH提交怎么办?
直接修改项目目录下 .git文件夹下的config文件,将地址修改一下就好了。
git地址获取可以看如下图切换。

经过上面的配置我们的SSH key已经配置完成了,不用在每次都需要输入繁琐的密码了,是不是很舒服。
克隆项目到本地,url就是地址;地址有不同格式,例如:https的地址:https://xxx.com/某项目/某项目.git;ssh的地址:git@xxxx.com:xxx/xxx.git。
- git config --global user.name "你的大名"
- git config --global user.email "你的联系邮件"
-
- # 全局别名设置,有习惯的别名以后,会非常顺手
- git config --global alias.st "status"
-
- # 将项目克隆到本地
- git clone [url]
-
- #生成公钥 用户连接远程仓库,不用每次都输入账户密码
- ssh-keygen -o
- #然后都是enter下去.生成的密钥用命令查看,然后配置到远程库,用git@xxx 协议操作
- cat ~/.ssh/id_rsa.pub
-
- # 当前工作目录git初始化,将跟踪目录下的文件
- git init
-
- # 查看当前及所有分支
- git branch
-
- # 将文件添加到暂存区
- git add xxx.txt
-
- # 所有变动的文件,并添加到缓存区
- git add .
-
- # 查看当前文件内,文件变动状态,是否被暂存
- git status
-
- # 查看和对比所有变动的文件,所变动的东西
- git diff [可选定某个文件查看]
-
- # 将暂存的文件提交到本地仓库中,并且打个备注,可以多次提交,然后在一起推送到远程仓库中
- git commit -m "你的小备注别忘了写"
-
- # 跳过add命令,直接将所有变动的文件提交到本地仓库
- git commit -a -m "小备注依然不能忘"
-
- # 删除文件,如果文件已经被add了,则需要在rm后加 -f 就可以删除了
- git rm
-
- # 保留文件还存在工作目录中,并且删除暂存.
- git rm --cached README
-
- # 查看提交历史, 可以格式化查看,这个要自己写格式化样式...
- git log
-
- # 放弃所有更改,或者某个文件的更改
- git checkout [.|fname]
-
- # 查看当前工作目录的远程仓库
- git remote
-
- # 添加远程仓库 <别名> <地址>
- git remote add < shortname > < url >
-
- # 推送代码到远程仓库的当前分支,一般选择分之后,命令可以省略分支
- git push <分支>
-
- # 将远程仓库的代码拉更新到本地仓库
- git pull
-
- # 将<目标分支>的变动合并到当前分支上
- git merge <目标分支>
-
- # 保存本地仓库的账号
- git config --local credential.helper store
-
- # 保存git全局账号
- git config --global credential.helper store
-
git init 创建好了本地git仓库,会发现在test目录中多了一个.git目录,并且这个目录是隐藏的。
提交文件到中转站和仓库(add和commit)

git add 告诉git 将文件添加到仓库等等提交(也可以认为添加到了仓库中转站)没有任何输出表示正确添加到中转站。
git commit -m "wrote a readme file" ,告诉git 将刚才放置在中转站的提交到仓库 并给这个提交动作附上一个标签。
注意:
为什么提交要用add和commit 因为可以add多个文件到中转站,一次commit就可以将中转站中的文件提交到仓库。
- $ git add file1.txt
- $ git add file2.txt file3.txt
- $ git commit -m "add 3 files."
git status和git diff
一般步骤为,检查init的git仓库的文件是否有修改 git status ;如果有修改就查看修改的地方是不是正确的 git diff ;如果修改正确的就提交的中转站 git add
- $ git status #查看init仓库所有文件的状态,即查看当前文件test目录中的所有文件的状态(未修改/修改/更新)包括中转站中的文件状态
- On branch master
- Changes not staged for commit:
- (use "git add
..." to update what will be committed) - (use "git checkout --
..." to discard changes in working directory) -
- modified: readme.txt # 红色表示此文件被修改
-
- no changes added to commit (use "git add" and/or "git commit -a")
- $ git diff readme.txt #查看被修改的文件,修改了哪些东西
- diff --git a/readme.txt b/readme.txt #比较修改前和修改后的文件
- index d8036c1..53d4271 100644
- --- a/readme.txt
- +++ b/readme.txt #在readme.txt中做了增加操作
- @@ -1,2 +1,2 @@
- -Git is a version control system.
- -Git is free software.
- \ No newline at end of file
- +Git is a distributed version control system.
- +Git is free software.


- $ git add file1.txt
- warning: LF will be replaced by CRLF in test.txt.
- The file will have its original line endings in your working directory.
LF是linux下的换行符,而CRLF是enter + 换行。
当创建文档的时候使用的环境是windows,而git运行环境在linux环境。
解决方式:
git config --global core.autocrlf false
假如的改动到现在已经提交了三个版本的readme.txt到.git仓库:
- 版本1:wrote a readme file
-
- Git is a version control system.
- Git is free software.
-
- 版本2:add distributed
-
- Git is a distributed version control system.
- Git is free software.
-
- 版本3:append GPL
-
- Git is a distributed version control system.
- Git is free software distributed under the GPL.
查看git的快照commit,需要使用git log:
类似每次快照都要产生log文件,需要用git log来查看快照,git log是按照最新到最旧来显示。
如下:
- $ git log
- commit f78cd0925b2bc2883d7ed4de49b1a851367ae56d #这一串数字代表快照的id号,由SHA1产生
- Author: userlhb <lhb@lhb.com>
- Date: Sat Mar 26 20:23:52 2016 +0800 #最新的commit快照 也叫做HEAD快照
-
- append GPL
-
- commit 96829291d720b3b84d0ab2a5aad89b0af97a1394
- Author: userlhb <lhb@lhb.com>
- Date: Sat Mar 26 16:20:13 2016 +0800
-
- add distributed #这是HEAD快照的前一个快照 用HEAD^表示
-
- commit 51af5b36b85c52e86b6140d3a73b5e22cd3f78da
- Author: userlhb <lhb@lhb.com>
- Date: Sat Mar 26 15:36:57 2016 +0800 #最旧的commit快照
-
- wrote a readme file #这是HEAD快照的前前一个快照 用HEAD^^表示,问题来了?如果前前一百个,怎么表示? HEAD~100
或者显示为一行,添加--pretty=oneline:
- $ git log --pretty=oneline
- f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
- 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
- 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file
git中实现版本回退使用git reset
先看下面两幅图:

git reset 可以控制指针 HEAD 在不同的快照直接切换,如果需要切换到上一个快照用git reset --hard HEAD^。
git reset 和 git commit
git log 查看所有提交到版本库中的快照(版本)。

回退到中间那个版本add disributed:
- $ git log --pretty=oneline #列出.git仓库中的所有版本号
- f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
- 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
- 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file
-
-
- $ git reset --hard HEAD^ #回退到前一个版本add distributed
- Unstaged changes after reset:
- M readme.txt
-
-
- $ git log --pretty=oneline #查看是否回退到add distributed,不能查看之前的版本。
- 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
- 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file
有没有发现什么?对,回退到add distributed后,不能查看之前的版本。要是又要回退到最开始那个版本怎么办呢?
解回退到仓库中最新的那个版本:因为 git reflog 能记录 git reset和git commit
- $ git reflog #罗列出所有的HEAD动作
- 9682929 HEAD@{0}: reset: moving to HEAD^
- f78cd09 HEAD@{1}: commit: append GPL #append GPL 的id是 f78cd09
- 9682929 HEAD@{2}: commit: add distributed
- 51af5b3 HEAD@{3}: commit (initial): wrote a readme file
-
-
-
- $ git reset --hard f78cd09 #移动HEAD指针到 f78cd09 即 append GPL
-
-
- $ git log --pretty=oneline #查看是否切换到append GPL 这个版本
- f78cd0925b2bc2883d7ed4de49b1a851367ae56d append GPL
- 96829291d720b3b84d0ab2a5aad89b0af97a1394 add distributed
- 51af5b36b85c52e86b6140d3a73b5e22cd3f78da wrote a readme file
我们利用上述指令,在往demo文件夹中添加一个b.txt文件,然后通过`git log`查看我们的操作记录,然后可以查询到我们添加a.txt和b.txt的log日志,然后通过`git reset --hard b96f962d0f835e3114b6f51bf7c9bfe6125626e3`,去回退到我们的操作节点,此时我回退到第一次添加文件节点,也就是demo文件夹只有一个a.txt文件,以下是git端的效果截图:

此时查看`git log` 结果发现只有一条操作记录,也就是我们添加的a.txt的记录,我们之前进行的第二步操作呢?也就是添加的b.txt文件节点时,我们如何回退到最后这个节点呢?我们可以利用`git reflog`:

此刻demo文件夹中的2个文件内容,a.txt文本如下:
初始化内容
b.txt文本内容如下:
这是b文本内容
我们继续为b.txt添加如下记录信息
我们临时为b添加记录
此刻b.txt文件内容如下:
- 这是b文本内容
- 我们临时为b添加记录
上述意思就是在更新`b.txt`文件内容,添加操作记录如果用到开发场景,我们在**需求1**,然而由于工作需要,**需求1**需要暂且搁置,我们需要做**需求2**,**需求1**代码需要砍掉,等我们做完**需求2**,我们继续需要获取我们之前**需求1**的代码,我们可以利用`git stash`命令,以下是该命令的含义:
- git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
- git stash list 查看“某个地方”存储的所有记录
- git stash clear 清空“某个地方”
- git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
- git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
- git stash drop 编号,删除指定编号的记录

这次会有冲突,我们需要解决冲突,即可。
1. 切换到项目位置。
2. 创建一个项目的一新分支。
- mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
- $ git branch first-branch
3. 切换到新建的分支下。
- mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
- $ git checkout first-branch
- Switched to branch 'first-branch'
-
- mike@win10-001 MINGW64 ~/cookbook/cookbook (first-branch)
4. 第2步和第3步可以合并成一步。
- mike@win10-001 MINGW64 ~/cookbook/cookbook (first-branch)
- $ git checkout -b first-branch
5. 改变文件的内容。
- mike@win10-001 MINGW64 ~/cookbook/cookbook (first-branch)
- $ echo "Change" >> README.md
6. 提交这个改变
- $ git commit -a -m 'Readme changed'
- warning: LF will be replaced by CRLF in README.md.
- The file will have its original line endings in your working directory.
- [first-branch dc7b6d5] Readme changed
- 1 file changed, 1 insertion(+)
7. 推送分支到gitlab服务器
- mike@win10-001 MINGW64 ~/cookbook/cookbook (first-branch)
- $ git push -u origin first-branch
- Counting objects: 3, done.
- Writing objects: 100% (3/3), 262 bytes | 131.00 KiB/s, done.
- Total 3 (delta 0), reused 0 (delta 0)
- remote:
- remote: To create a merge request for first-branch, visit:
- remote: http://gitlab.aishangwei.net/root/cookbook/merge_requests/new?merge_request%5Bsource_branch%5D=first-branch
- remote:
- To gitlab.aishangwei.net:root/cookbook.git
- * [new branch] first-branch -> first-branch
- Branch 'first-branch' set up to track remote branch 'first-branch' from 'origin'.
8. 切换到master分支。
- $ git checkout master
- Switched to branch 'master'
- Your branch is up to date with 'origin/master'.
9. 合并first-branch分支到master分支。
$ git merge first-branch –no-ff
在我们保存和关闭编辑器的时候,这个分支将会合并,具体信息如下:
- mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
- $ git merge first-branch --no-ff
- Merge made by the 'recursive' strategy.
- README.md | 1 +
- 1 file changed, 1 insertion(+)
10. 推送改变到Gitlab上的master。
- mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
- $ git push origin master
- Counting objects: 1, done.
- Writing objects: 100% (1/1), 223 bytes | 223.00 KiB/s, done.
- Total 1 (delta 0), reused 0 (delta 0)
- To gitlab.aishangwei.net:root/cookbook.git
- 53ec2ca..5e1ebdd master –> master
11. 删除所创建的分支。
- mike@win10-001 MINGW64 ~/cookbook/cookbook (master)
- $ git push origin --delete first-branch
- To gitlab.aishangwei.net:root/cookbook.git
- - [deleted] first-branch
我们可以通过`git branch` 查看我们的项目所有分支,默认只有一个`master`主分支,我们可以通过`git branch dev`(dev是我们起的分支名)新建一个分支,名字是dev开发分支,然后通过`git checkout dev`切换到我们新建的dev分支,我们也可以通过`git checkout -b 分支名`一并实现创建、切换分支的功能。

我们切换到`dev`分支,通过`touch 文件名`创建一个文件,然后add、commit ,意思就是在dev分支上做一些修改,并保存在dev分支上,然后在切回master分支,我们要做的就是将dev上更新的内容,也在master上做同样的修改,我们可以用`git merge` 分支名,将dev上的更新内容,合并到master上另外删除分支使用`git branch -d 分支名`。

利用`github`创建项目,会出现如下指令,需要在git终端输入创建生成项目,要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname] [url]:
通过`git remote add origin 和https://github.com/iyongfei/test.git`。


接下来我们通过`git clone https://github.com/iyongfei/test.git`来`clone`下载我们的`github`项目,我们默认拉取的是`master`分支(默认分支可以在**github**设置其他分支)。
然后根据以前的git指令,进行`git add .` 和 `git commit -m "备注信息"`。
注意注意,由于项目开发都是协同开发,我们在接下来在提交代码之前,需要`git pull origin 分支`,拉取对应分支代码,然后如果有冲突解决冲突,然后在`git push origin 分支名`。
ps:我如下的截图在提交代码时,为了简化操作,没有`git pull` 。

我们还可以往`github`项目上添加新分支,我们通过`git branch 分支`创建分支,通过`git checkout 分支`切换分支,(或者通过`git checkout -b 分支`,创建并切换分支),然后在添加、提交(我这里没有添加任何信息),最后`git push origin dev` 往github项目上添加新分支

我们还可以拉取其他分支的内容到本分支,比如我在`master`上添加内容,然后我在`dev`分支上去拉取`master`上的代码,然后在提交到对应的github分支`dev`上(我本地依然没有添加额外的内容)。

冲突如何产生?我们如何解决冲突?当自己拉取了`dev`的代码,同事也拉取了`dev`的代码,同事先于我提交代码,然后自己也在本地修改了代码,如果修改了同一个文件,会出现冲突情况,再次拉取`dev`代码会失败,而且提交失败。

解决方式一:先在自己本地`dev`,通过`git stash`暂存修改,然后`git pull 分支`代码,再然后`git stash pop` 合并代,解决冲突(删掉我们不需要的代码),然后在提交代码:
- <<<<<<< Updated upstream
- aa为各个
- bb额外分
- =======
- aac
- bbd
- >>>>>>> Stashed changes

解决方式二:不利用`git stash`,利用`compare`对比软件,将有冲突的文件,剪切出来,然后拉取`dev`分支代码,就把github的`dev`分支最新代码,同步下来,然后在跟自己的剪切出来的代码段,进行对比,将自己的代码更新到同步下来的代码,然后在提交到github对应的分枝上。
原因分析:
引起该错误的原因是目录中没有文件,空目录是不能提交上去的。
解决办法:
- $ touch README
- $ git add README
- $ git commit –m’first commit’
- $ git push origin master
问题产生:
使用git clone 命令从 eagain.net 克隆gitosis.git源码出错。
解决办法:
git clone git://github.com/res0nat0r/gitosis.git
解决办法:
在git服务器上要提供的项目下面执行:
git update-server-info
问题产生:
在centos下使用yum install gitweb 命令安装gitweb后找不到gitweb的默认安装路径。
原因分析:
网络上的说法默认路径是 /var/www/git ,但是在我的centos虚拟机中,安装完gitweb后,默认路径是/usr/share/gitweb。
解决办法:
由于按网上的说法,找不到gitweb的默认安装路径,我使用了find 命令,用来查找gitweb所在的目录。
问题产生:
在安装gitosis的时候,需要预先安装工具包python-setuptools,安装命令比较简单:
yum install python-setuptools
但是在clone了gitosis代码,执行python安装命令的时候报错,错误提示如下:
ImportError: No module named setuptools
原因分析:
centos默认的python版本是2.4.3,因为一次机会我升级了python的版本到3.3.0,这样就出现了错误。
解决办法:
我的办法是降低了python的版本,有兴趣的同学可以尝试安装distribute包,看能不能解决这个问题。
问题产生:
本地项目添加了远程仓库,但是在推送代码到远程仓库的时候,报无法连接到远程服务器。
原因分析:
github和本地代码做推送和拉取时,需要用到ssh的密钥对进行数据加解密,由于github上新建的项目没有添加密钥,所以本地仓库连接不到远程仓库。
解决办法:
在github上为该项目添加公钥,推荐做法是不要单独为每个项目添加公钥,而是直接通过github帐号的ssh信息维护开发机的ssh公钥。