一:
-----网上给力教程-----
1.1.git参考手册
1.2 git SubModule子模块完整教程
1.3 git高效学习中文版
1.4 如何高效利用github
Git and Repo cheatsheet(官网介绍)
二
:
-----常用命令介绍-----
-----------------------------------------------------
采取强制git
$git push gitblit master -f
-----------------------------------------------------
建立分支避免覆盖
$git branch arm-bin
-----------------------------------------------------
查看分支
$git branch
-----------------------------------------------------
切换分支
$git checkout tmp
-----------------------------------------------------
删除多余分支
$git branch -d arm-bin
-----------------------------------------------------
删除已更改并提交了的分支
$git branch -D arm-bin
-----------------------------------------------------
查看git项目
$git log
-----------------------------------------------------
默认下载代码 -- 默认下载 master分支代码
-----------------------------------------------------
下载别的分支的代码 -- 下载 arm-bin分支代码
de>de>
de>$git clone
-b arm
-bin http
:
/
/[email protected]
:
8010
/git
/Server
/miniserver.gitde>
-----------------------------------------------------
git status 查看有什么文件被改动过
-----------------------------------------------------
git status -s 查看当前修改过什么文件
-----------------------------------------------------
git diff 观看所有修改的文件,那些地方被修改了~
-----------------------------------------------------
git diff file_name 观看file_name文件,那些地方别修改过
-----------------------------------------------------
git reset --hard 还原回到commit这个还原点的状态!
-----------------------------------------------------
git whatchanged 查看所有还原点中,工程对那些文件做了修改
-----------------------------------------------------
git remote rm origin 删除远程的origin这个名字 --
一般origin这个名字是保存在 .git/config中,
也可以直接进入到这个文件中,删除origin
-----------------------------------------------------
git fetch origin master:tmp 下载远程服务器上的源码,作为我本地源码的 tmp分支
-----------------------------------------------------
git merge tmp 合并当前分支和 tmp分支
-----------------------------------------------------
git config core.filemode false 忽略文件权限配置
以上这样设置了忽略文件权限,查看下配置:
$ cat .git/config
-----------------------------------------------------
三
:
-----基本例子介绍-----
3.1 我自己创建一个仓库,然后上传代码到仓库中
在这里,暂定定义服务器 ip : 192.168.6.201
3.1.1: 在服务器端
创建一个 项目的.git仓库
de>
root@dev-201:/home/git# su git
$ mkdir teamwork.git
$ cd teamwork.git
$ git init --bare
$ exit
de>
3.1.2:在自己的pc机端
创建一个项目
de>
root@ubuntu:/home/zhx/work# mkdir teamwork
root@ubuntu:/home/zhx/work# cd teamwork
root@ubuntu:/home/zhx/workteamwork# mkdir aaa
root@ubuntu:/home/zhx/workteamwork# touch cccc
root@ubuntu:/home/zhx/workteamwork# cd aaa
root@ubuntu:/home/zhx/workteamwork/aaa# touch aaa ccc
de>
3.1.3 使用git项目管理上传项目到服务器中
de>
root@ubuntu:/home/zhx/work # git init
root@ubuntu:/home/zhx/work # git add .
root@ubuntu:/home/zhx/work # git commit -am "No.1"
root@ubuntu:/home/zhx/work # git remote add origin [email protected]:teamwork.git //仅仅把origin名字等于了 git@192 。。。
root@ubuntu:/home/zhx/work # git push origin master //上传到服务器中
de>
3.1.4:另外一个人的pc上下载该项目
de>
zhx@ubuntu:/home/zhx/work # git clone git@192.168.6.201:teamwork.git //通过执行这个命令,就可以把存在在服务器上的下载下来!
de>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3.2 以一个员工的身份,从无到有 上传自己的代码到服务器中
配置Git
$git config --global user.name "zhenghexiang"
$git config --global user.email "zhenghexiang@boromax.com"
查看配置
$git config user.name
$git config user.email
$cat ~/.gitconfig
初始化仓库并提交 -- 假设远程的服务器有一个 miniserver.git 仓库
$git init
$git add .
$git commit -m 'arm-linux-server'
$git remote add gitblit http://zhenghexiang@boromax.cn:8010/git/Server/miniserver.git
$git push gitblit master
经理说git这个域名上传速度会更快
git remote add gitblit http://[email protected]:8010/git/Server/miniserver.git //这个是骗人的,任何域名都一样...
因为我之前已经git了一部分代码上去,所以再次git不允许覆盖
de>de>
de>To http
:
//[email protected]:8010/git/Server/miniserver.git
! [rejected] master
-
> master (non
-fast
-forward)
error
: failed to push some refs to
'http://[email protected]:8010/git/Server/miniserver.git'
To prevent you from losing history, non
-fast
-forward updates were rejected
Merge the remote changes (e.g.
'git pull') before pushing again. See the
'Note about fast-forwards' section of
'git push --help'
for details.de>
所有,在这个问题上,在不改变仓库的情况下,有以下两种解决方法:
1:采取强制 git 上传
$git push gitblit master -f
强制 git 太暴力,很容易把仓库弄坏,这里推荐使用branch分支的方法!!
2:建立分支!
a.把要添加的内容重新建立一个git工程,然后添加分支
$cd arm-bin
$git init
$git add .
$git commit -m 'arm-bin'
$git branch arm-bin //分支名随便取
b.切换到你当前创建的分支并git到服务器
$git checkout arm-bin
$git remote add gitblit http://[email protected]:8010/git/Server/miniserver.git
$git push gitblit arm-bin
下载git服务器的代码
$git clone http://zhenghexiang@boromax.cn:8010/git/Server/miniserver.git
此命令默认下载master主分支上的代码,要想下载其它分支的代码 -- 此命令下载别的分支上的代码!
$git clone -b arm-bin http://zhenghexiang@boromax.cn:8010/git/Server/miniserver.git
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3.3 当修改了一些文件之后,查看修改过什么文件和改动过什么内容
首先查看有什么文件被修改过 -- 在这里可以看到,我们修改了aaa.c 和 aaa.c.bak两个文件
如如下操作:
然后在看一下,这些文件我们具体修改了什么
如下操作:
可以看到,对于
aaa.c 文件, 我们添加了 。
对于
aaa.c.bak 文件,我们添加了
删除了 !!!
当然啦,我们想单独查看某个文件做了什么修改,我们可以使用如下命令:
de>
$ git diff file_name
如:
$ git diff aaa.c
de>
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3.4 当发现修改的文件有问题的时候,想回到前一个还原点
首先,使用
git log 观看已经保存的还原点
在这里可以看到,我们有两个还原点,
一个是 :
另外一个是:
在这里,我们想回到第一个还原点 --
70161b8f57035825f0289bd9978e9b00c65617b9 上
使用如下命令:
de>
$ git reset
70161b8f57035825f0289bd9978e9b00c65617b9
de>
当执行上面的命令后,仅仅是回到那个还原地上,但是代码上做的修改还是没有改变回去的!,还需要做
一下的操作,完全改变回去!
de>
$ git checkout
-f
&& git clean
-df
de>
git checkout -f是清除更改过的文件的差异部分,
git clean -df是清除新创建的文件,
当然在git reset的时候加上--hard也可以删除改动部分。
git reset --hard <还原点> 这个命令就相当于 git reset <还原点>和 git checkout -f && git clean -df 这两个命令的结合!
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3.5 单独撤销未提交的修改
(1) git checkout
恢复某个已修改的文件(撤销未提交的修改):
de>de>
de>$ git checkout file
-namede>
例如:
我先使用git diff aaa.c 比较我这里的 aaa.c做了什么修改:
de>de>
de>$ git diff aaa.cde>
可以看到在这里,我添加了几行的代码,但是这些修改,我都不想要,要还原回去以前的状态,使用如下命令:
de>de>
de>$git checkout aaa.cde>
在使用git diff aaa.c中可以得到:
已经还原到最初的没有修改前的状态上了!
比如修改的都是java文件,不必一个个撤销,可以使用
de>de>
de>$ git checkout
*.javade>
撤销所有修改
de>de>
de>$ git checkout .de>
(2) git revert
撤销某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交
* git revert HEAD 撤销前一次 commit
* git revert HEAD^ 撤销前前一次 commit
* git revert commit-id (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3.6 下载远程服务器源码,作为自己源码的一个分支,判断是否合并!
由于在一份代码上,有多个人在对这份代码进行着修改和管理,所以,在有些使用中,别人做的
修改,并且已经提交到服务器上了,我自己的本地代码也做了有修改,在这个时候不能贸然合并,
我们可以通过一些的一些命令,来判断是否合并。
首先在这里先说明:
和直接
是等价的操作!!
在实际使用中,git fetch更安全一下
因为在merge前,我们可以查看更新的情况,然后在决定是否合并!
在这里,有如下操作实验例子:
分布下载服务器中的代码,在合并
Machine-A、Machine-B
Machine-A clone 工程,然后更改提交push
Machine-B ==> git fetch origin master:tmp
将服务器上的代码创建拷贝到本地tmp分支,然后切换到tmp分支
此时在tmp分支的文件中可以看到更改的痕迹
切换回master分支,提示如下,并且打开文件无任何更改。
说的是本地的master分支落后于服务器上的master分支一次提交,可以快进
比较两个分支,可以看到本地master分支上少了一些注释。
合并分支
git log -p master ..origin/master ==>显示了最新的一次commit提交的log
git log -p master origin/master ==>显示了所有commit提交的log
直接下载服务器中的代码并合并
直接git pull
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3.7 假设这么一种情况,user1改变了代码并且推送了,
而user2不知道源代码有了更新,没有pull到本地,
还是在原始代码的基础上更改,然后也要推送。
这个时候会发生如下现象:
显然push被拒绝了,因为是非快进式更新
对于快进式更新,我的理解是比如服务器上有commit1、commit2、commit3三次提交,而本地机器上目前的提交状况是commit1、commit2、commitN,
此时要push commitN这次提交,因为不符合快进式提交原则就会失败,而如果是commit1、commit2、commit3、commitN,那么此时提交是一个有序的快进式的,可以提交。
一种解决方式为:git push origin master -f (强制提交),
会覆盖了其他用户提交的结果,不可取
第二种方式:git pull & git push,推送成功
本地工程log
服务器上的工程log
此时的状况就是快进式的更新了。
合并冲突的情况有如下几种,也有不成功的情况。
1.修改不同文件
2.修改相同文件的不同区域
3.修改相同文件的相同区域
4.两个用户同时修改相同文件的文件名
5.user1修改了文件名,而user2使用旧文件名修改(树冲突)
四:-----碰到问题解答-----
4.1. git commit -am问题
当使用git commit时:
de>
root@dev
-
201
:
/home
/git
/PcKey
/gitosis
-admin
#
git commit -am "add user 200 196"
de>
出现如下问题:
de>
*
*
* Please tell me who you are.
Run
git config
--global user.email
"[email protected]"
git config
--global user.name
"Your Name"
to set your account's default identity.
Omit -- global to set the identity only in this repository.
de>
并且使用git log没有显示新添加的信息的时。
解答:
原因如下,没有添加
email 和
name 地址,在命令行中,执行如下操作即可
de>
#
git config --global user.email "boromax.com"
#
git config --global user.name "boromax"
#
git commit -am "add user 200 196"
de>
git log 时即可看到提交的节点
到这里说明commit成功!!
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4.2.使用 git push origion master上传的时候:
de>
root@dev-200:/home/b/teamwork#
git remote add origin
git@192.168.6.201:repositories/teamwork.git
root@dev-200:/home/b/teamwork#
git push origin master
de>
提示如下问题时:de style="font-size: 14px;" >
Counting objects
:
6, done.
Delta compression
using up to
8 threads.
Compressing objects
:
100
% (
3
/
3), done.
Writing objects
:
100
% (
6
/
6),
333 bytes, done.
Total
6 (delta
0), reused
0 (delta
0)
remote: error: insufficient permission for adding an object to repository database ./objects
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To git@
192.
168.
6.
201
:repositories
/teamwork.git
! [remote rejected] master
-
> master (unpacker error)
error: failed to push some refs to '[email protected]:repositories/teamwork.git'
de>
解答:
你远程服务器上的teamwork.git 是root的权限,请使用git权限创建 teamwork.git!!
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4.3.使用 gitthub 碰到的问题
如果输入$ git remote add origin [email protected]:djqiang(github帐号名)/gitdemo(项目名).git
提示出错信息:fatal: remote origin already exists.
解决办法如下:
1、先输入$ git remote rm origin
2、再输入$ git remote add origin [email protected]:djqiang/gitdemo.git就不会报错了!
3、如果输入$ git remote rm origin 还是报错的话,error: Could not remove config section 'remote.origin'. 我们需要修改gitconfig文件的内容
4、找到你的github的安装路径,我的是C:\Users\ASUS\AppData\Local\GitHub\PortableGit_ca477551eeb4aea0e4ae9fcd3358bd96720bb5c8\etc
5、找到一个名为gitconfig的文件,打开它把里面的de>[remote "origin"]那一行de>删掉就好了!
如果输入$ ssh -T [email protected]
出现错误提示:Permission denied (publickey).因为新生成的key不能加入ssh就会导致连接不上github。
解决办法如下:
1、先输入$ ssh-agent,再输入$ ssh-add ~/.ssh/id_key,这样就可以了。
2、如果还是不行的话,输入ssh-add ~/.ssh/id_key 命令后出现报错Could not open a connection to your authentication agent.解决方法是key用Git Gui的ssh工具生成,这样生成的时候key就直接保存在ssh中了,不需要再ssh-add命令加入了,其它的user,token等配置都用命令行来做。
3、最好检查一下在你复制id_rsa.pub文件的内容时有没有产生多余的空格或空行,有些编辑器会帮你添加这些的。
如果输入$ git push origin master
提示出错信息:error:failed to push som refs to .......
解决办法如下:
1、先输入$ git pull origin master //先把远程服务器github上面的文件拉下来
2、再输入$ git push origin master
3、如果出现报错 fatal: Couldn't find remote ref master或者fatal: 'origin' does not appear to be a git repository以及fatal: Could not read from remote repository.
4、则需要重新输入$ git remote add [email protected]:djqiang/gitdemo.git
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4.4. linux中,递归删除.gitinore文件
find . -name ".gitignore" | xargs rm -f
4.5 当上传命令的时候碰到
error: Couldn't resolve host 'git.boromax.cn' while accessinghttp://[email protected]:8010/git/BR3100/38xx.git/info/refs?service=git-receive-pack
fatal: HTTP request failed
解决:
sudo vim /etc/resolv.conf
-------------------------------------
nameserver xx.xx.xx.xx
如果这个没有设置的话会造成update时域名不能解析。
sudo /etc/init.d/networking restart
防止dhcp自动的来该dns设置
sudo chattr+i /etc/resolv.conf
4.6. linux中,
忽略改变文件属性的记录
$git config core.filemode false
这样就可以设置忽略文件权限了,查看一下配置:
cat .git/config
4.7. 如何删除远程提交的某个点
首先还原到你需要的点,然后使用命令
git push origin master --force
转载自:http://blog.163.com/zheng_he_xiang/blog/static/18650532620154493410765/