git命令行操作

现在随着git的优势展现,公司几乎都抛弃了svn而使用git作为版本控制工具,那么咱们就来聊聊git操作的方法。

此篇文章根据自己想法,比较随心所欲,想到哪里写到哪里,但也不是随便写,根据自己在工作中的一些用法来记录一下。

一、要了解git就要先了解几个概念       工作目录(work tree)       本地仓库(local repository)   暂存区域 (index)

工作目录:  就是你可以使用git操作的命令,比如git checkout啦,暂时可以理解为当前目录下有.git文件夹的目录 

暂存区域:  所谓的暂存区域只不过是个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件(index),不过标准说法还是叫暂存区域。

本地仓库:  就是把暂存区域里面的文件提交到git能够管理的和追踪的仓库里面 

二、git 分为客户端和服务器端

首先,从远程仓库上拉取代码

(1)创建工作目录,并在此目录下使用git bash here 命令行工具

         git clone --bare ××××××××××××××.git -b branch(分支)  或者

         git clone ××××××××××××××.git -b branch(分支)  

这二个命令是有区别的。第一个命令是创建了一个裸仓库(没有工作区,没有工作区还有一个好处就是空间占用小)

第二个命令是创建一个对等工作区(和远程的仓库的备份,目录都一样,所以我们使用此命令来拉取代码

(2)拉取远程仓库更新过的代码和自己更新的文件提交到远程仓库

1、使用git命令配置远程仓库 (git remote add <主机名> <网址>)

git remote add origin ××××××××××××××.git

2、git查看本地分支和远程分支

git branch  //查看本地分支

git branch -a //查看远程分支

git branch test //创建本地分支

git checkout test //切换到分支

3、同步代码(git pull <远程主机名> <远程分支名>:<本地分支名>

eg:取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。

git pull origin next:master

如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

git pull origin next

4、提交代码(git  push 命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿;git push <远程主机名> <本地分支名>:<远程分支名>

注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>

如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。

git push -u origin master

5、提交修改文件到本地仓库(git commit 主要是将暂存区里的改动给提交到本地的版本库。git commit - m "描述")

git add .(把本地仓库中所有文件添加到版本库)

git commit - m "" //提交到本地仓库

git commit -am "提交描述"(此命令等价于上面的2条命令效果)

git remote add origin ××××××××××××××.git //配置远程仓库

git push -u origin branch(分支名)

6、git合并分支

可以切换分支,但是我们本地默认分支就是stockout

git pull //拉取代码

git add . //把本地修改提交暂存区

git commit -m "bug修改" //提交本地代码到stockout

git  checkout devlop  //切换到devlop分支 

git merge stockout //把stockout分支合到devlop分支上

修改远程仓库的地址

git remote set-url origin url

如果远程仓库已经有代码了

$ git push
To ../remote/  
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '../remote/'

问题 (Non-fast-forward) 的出现原因在于: git remote 仓库中已经有一部分代码, 所以它不允许你直接把你的代码覆盖上去. 于是你有 2 个选择方式:

1)强推, 即利用强覆盖方式用你本地的代码替代 git 仓库内的内容

          git push -f

 (2)  或者先把 git 的东西 fetch 到你本地然后 merge 后再 push

        git fetch

        git merge

7、对git冲突的解决

首先来看一下一则错误信息:

error: You have not concluded your merge (MERGE_HEAD exists).

要了解错误信息,首先要了解git fetch 和 git pull的区别

git fetch origin master   //表示从远程master上拉取最新代码,但是不合并到本地master
git log -p master..origin/master //比较本地的master分支和origin/master分支的区别
git merge origin/master          //合并远程分支到本地

 

git pull origin master  //相当于进行了 git fetch 和 git merge两部操作

 再说导致报错:error: You have not concluded your merge (MERGE_HEAD exists).的原因可能是在以前pull下来的代码自动合并失败

解决办法一:保留本地的更改,中止合并->重新合并->重新拉取

git merge --abort  //中止合并

git reset --merge //git reset 表示回到合并之前的状态 

git pull

解决办法二:舍弃本地代码,远端版本覆盖本地版本(慎重)

git fetch --all

git reset --hard origin/master

git fetch

对于git reset 命令的使用,回退版本

git reset (–mixed) HEAD~1 
回退一个版本,且会将暂存区的内容和本地已提交的内容全部恢复到未暂存的状态,不影响原来本地文件(未提交的也 
不受影响) 
git reset –soft HEAD~1 
回退一个版本,不清空暂存区,将已提交的内容恢复到暂存区,不影响原来本地的文件(未提交的也不受影响) 
git reset –hard HEAD~1 
回退一个版本,清空暂存区,将已提交的内容的版本恢复到本地,本地的文件也将被恢复的版本替换
四、当在码云上创建仓库后,和本地代码关联后,git pull origin master 会出现

”git无法pull仓库refusing to merge unrelated histories“

合并pull两个不同的项目,出现的问题如何去解决

如果合并了两个不同的开始提交的仓库,在新的 git 会发现这两个仓库可能不是同一个,为了防止开发者上传错误,于是就给下面的提示

fatal: refusing to merge unrelated histories

如我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传。这时会发现 github 的仓库和本地的没有一个共同的 commit 所以 git 不让提交,认为是写错了 origin ,如果开发者确定是这个 origin 就可以使用 --allow-unrelated-histories 告诉 git 自己确定

遇到无法提交的问题,一般先pull 也就是使用 git pull origin master 这里的 origin 就是仓库,而 master 就是需要上传的分支,因为两个仓库不同,发现 git 输出 refusing to merge unrelated histories 无法 pull 内容

因为他们是两个不同的项目,要把两个不同的项目合并,git需要添加一句代码,在 git pull 之后,这句代码是在git 2.9.2版本发生的,最新的版本需要添加 --allow-unrelated-histories 告诉 git 允许不相关历史合并

假如我们的源是origin,分支是master,那么我们需要这样写git pull origin master --allow-unrelated-histories 如果有设置了默认上传分支就可以用下面代码

git pull origin master --allow-unrelated-histories

git 本地修改 未add操作,恢复本地库命令

git checkout . //.表示全部

git  checkout 文件名

如果已经add和commit操作

git reset 文件名

(1)如果有文件未提交,又要切换分支那就需要使用一个很重要的命令

分支切换利器,我们经常会遇到,正在一个分支上开发,写了很多东西,其中提交了一部分,一部分正在写,还没写完,这时突然来个线上问题,需要我们切换到线上分支去处理,我们怎么办,提交?还没写完,还不能通过编译,不提交,放弃?更不可能 辛苦工作一天了。这时就需要下面这个命令,特别长用

git stash 暂时将未提交的变化暂存,形成类似一个快照,然后就可以随意切换到其他分支了。

git stash pop 当在其他分支解决完问题,切换到当前分支,执行该命令,之前的暂存快照又恢复了,可以继续工作了

注意 当在不同的分支上都执行git stash时,在任何一个分支执行git stash pop有可能回覆盖当前的分支,所以不要在不同的分支同时执行git stash和git stash pop

常用git stash命令:

(1)git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。

(2)git stash list  :查看stash了哪些存储

(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}

(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show  stash@{$num}  -p ,比如第二个:git stash show  stash@{1}  -p

(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} 

(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}

(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储

(8)git stash clear :删除所有缓存的stash

git 删除本地分支的命令:

git 在删除分支的时候可以使用git branch -d featurename 也可以是git branch -D featurename

其中是有区别的

git branch -d 的时候如果本地分支没有被合并就会提示这个问题

git branch -D 是强制删除,所以直接执行 强制删除就好了。

要删除远程分支如下:

git push origin --delete featurename


git版本回滚

在当前分支上执行:git log 获取版本号。

git reset --hard 版本号

git push -f origin 远程分支

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值