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

一: -----网上给力教程-----

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 : / /[email protected] : 8010 /git /Server /miniserver.git
-----------------------------------------------------
下载别的分支的代码 -- 下载 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两个文件
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  -&& 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/

你可能感兴趣的:(Git -- 常用命令和基本例子操(推荐阅读))