您的位置:首页 > 其它

Git -- 常用命令和基本例子操(推荐阅读)

2015-11-17 14:53 453 查看
一:-----网上给力教程-----

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分支代码

$git clone http://zhenghexiang@boromax.cn:8010/git/Server/miniserver.git
-----------------------------------------------------

下载别的分支的代码 -- 下载 arm-bin分支代码

de>de>

de>$git clone -b arm-bin http://zhenghexiang@boromax.cn:8010/git/Server/miniserver.gitde>
-----------------------------------------------------

git status 查看有什么文件被改动过




-----------------------------------------------------
git status -s 查看当前修改过什么文件



-----------------------------------------------------
git diff 观看所有修改的文件,那些地方被修改了~
-----------------------------------------------------
git diff file_name 观看file_name文件,那些地方别修改过
-----------------------------------------------------
git reset --hard <commit hash 值> 还原回到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 git@192.168.6.201: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://zhenghexiang@git.boromax.cn:8010/git/Server/miniserver.git //这个是骗人的,任何域名都一样...
因为我之前已经git了一部分代码上去,所以再次git不允许覆盖
de>de>

de>To http://zhenghexiang@boromax.cn:8010/git/Server/miniserver.git
! [rejected] master -> master (non-fast-forward)

error: failed to push some refs to 'http://zhenghexiang@boromax.cn: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://zhenghexiang@boromax.cn: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两个文件

de>

$ git status
de>

如如下操作:





然后在看一下,这些文件我们具体修改了什么

de>

$ git diff
de>

如下操作:



可以看到,对于 aaa.c 文件, 我们添加了



对于 aaa.c.bak 文件,我们添加了

删除了

!!!

当然啦,我们想单独查看某个文件做了什么修改,我们可以使用如下命令:

de>

$ git diff file_name

如:

$ git diff aaa.c
de>



XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

3.4 当发现修改的文件有问题的时候,想回到前一个还原点

首先,使用

git log 观看已经保存的还原点

de>

$git log
de>

在这里可以看到,我们有两个还原点,



一个是 :


另外一个是:


在这里,我们想回到第一个还原点 -- 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 "you@example.com"

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 origingit@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 'git@192.168.6.201:repositories/teamwork.git'
de>

解答:
你远程服务器上的teamwork.git 是root的权限,请使用git权限创建 teamwork.git!!

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

4.3.使用 gitthub 碰到的问题

如果输入$ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git

提示出错信息:fatal: remote origin already exists.

解决办法如下:

1、先输入$ git remote rm origin

2、再输入$ git remote add origin git@github.com: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 git@github.com

出现错误提示: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 origingit@github.com: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://zhenghexiang@git.boromax.cn: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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: