Git 基本使用

一、本地建立Git


创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

$ mkdir learngit

$ cd learngit

$ pwd  /Users/alan/Documents/learngit

第二步,通过git init命令把这个目录变成Git可以管理的仓库

1.使用命令git add <file>可反复多次使用,告诉Git,把文件添加到仓库;   git add .      注意:添加多个未被跟踪的文件;

2.使用命令git commit -m “xxx”    xxx本次提交的描述内容,完成。

如果git status告诉你有文件被修改过,用git diff可以查看修改内容。

在Git中,历史记录我们用git log命令查看

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数。


二、回退到上一个版本


HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

$ git reset --hard HEAD^ 回退到上个版本

$ git reset --hard HEAD~3        回退到前3次提交之前,以此类推,回退到n次提交之前

$ git reset --hard commit_id    退到/进到 指定commit的sha码

git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:

$ git reset HEAD readme.txt

Unstaged changes after reset:

M readme.txt


git log可以查看提交历史,以便确定要回退到哪个版本。

git reflog用来记录你的每一次命令,以便确定要回到未来的哪个版本。显示整个本地仓储的commit,包括所有branch的commit,甚至包括已经撤销的commit。只要HEAD发生了变化, 就会在reflog里面看得到。

git log --graph --pretty=oneline --abbrev-commit   命令可以看到分支合并图。

--stat 列出文件的修改行数

--sortstat 只显示--stat中最后行数修改添加移除的统计

--graph 以简单的图形方式列出提交记录

--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。

--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。

--name-only 仅在提交信息后显示已修改的文件清单。

--name-status 显示新增、修改、删除的文件清单。

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。


cat fileName 查看文件内容

*以上的 fileName    指文件名


三、保存工作空间

可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

git stash

工作区是干净的,刚才的工作现场存到哪去了?

用 git stash list 命令看stash现场:

$ git stash list stash@{0}: WIP on dev: 6224937 add merge

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop(恢复的同时把stash内容也删了),回到工作现场。

如果要丢弃一个没有被合并过的分支,可以通过git branch -D alan强行删除。

四、git pull更新错误解决办法


Your local changes to the following files would be overwritten by merge

error: Your local changes to the following files would be overwritten by merge:

        src/main/java/com/config/main.java

Please, commit your changes or stash them before you can merge.


如果希望保留生产服务器上所做的改动,仅仅并入新更新的项, 处理方法如下:

git stash

git pull

git stash pop

然后可以使用git diff -w +文件名 来确认代码自动合并的情况.

反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:

git reset --hard

git pull


五、本地建立分支并推到远程


1.新建一个本地分支并切换到该分支:

 git checkout -b alan

2.把新建的本地分支push到远程服务器,远程分支与本地分支同名(把本地的alan分支push到远程的alan分支)

  git push origin alan:alan       或者         git push --set-upstream origin alan

3.删除远程分支

    推送一个空分支到远程分支,其实就相当于删除远程分支:

  git push origin:alan         或者         git push origin --delete alan



六、指定本地分支与远程关联 

AlandeMac-mini-2:YoPoint alan$ git pull

Enter passphrase for key '/Users/alan/.ssh/id_rsa':

There is no tracking information for the current branch.

Please specify which branch you want to merge with.

See git-pull(1) for details.

 git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with: 

 git branch --set-upstream-to=origin/<branch> alan

git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:

AlandeMac-mini-2:YoPoint alan$ git branch --set-upstream-to=origin/alan

Branch 'alan' set up to track remote branch 'alan' from 'origin'.


七、合并分支

$ git merge dev

Updating d17efd8..fec145a

Fast-forward

readme.txt |    1 +

1 file changed, 1 insertion(+)

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

用git log --graph命令可以看到分支合并图


八、本地推送到远程


有如下几种解决方法:

1.使用强制push的方法:

$ git push -u origin master -f

这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。

2.push前先将远程repository修改pull下来

$ git pull origin master

$ git push -u origin master

3.若不想merge远程和本地修改,可以先创建新的分支:

$ git branch branch-name

然后push

$ git push -u origin branch-name


九、远程仓库的操作


远程仓库下载到本地 git clone git@github.com:Alan/learngit.git

1. 查看远程仓库:git remote -v

2. 比如 在步骤一中,我们查看到远程有一个叫origin的仓库,我们可以使用如下命令从origin远程仓库获取最新版本的代码git fetch origin master:temp

上面代码的意思是:从远程的origin仓库的master分支下载到本地master并新建一个temp分支。

本地已经拉取了代码,想拉取远程某一分支的代码到本地

git checkout -b branch-name origin/branch-name   拉取远程分支到本地(方式一)

git fetch origin branch-name:branch-name 拉取远程分支到本地(方式二)

有可能出现错误提示:

fatal: 'origin/ac_branch' is not a commit and a branch 'ac_branch' cannot be created from it

解决方式:

执行命令:git fetch    同步一下仓库



3. 查看temp分支与本地原有分支的不同git diff temp

4. 将temp分支和本地的master分支合并git merge temp

现在,B的本地代码已经和远程仓库处于同一个版本了,于是B可以开心coding了。

最后再提一下,上面的步骤中我们创建了temp分支,如果想要删除temp分支,也是可以的,命令如下:

git branch -d temp

使用命令 git remote show origin,可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息。

使用 git branch -a 命令可以查看所有本地分支和远程分支(git branch -r 可以只查看远程分支)

推送分支,就是把该分支上的所有本地提交推送到远程库.

git push origin master

* 本地新建的分支如果不推送到远程,对其他人就是不可见的;

* 从本地推送分支,使用git push origin [branch-name],如果推送失败,先用git pull抓取远程的新提交;

* 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

* 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

* 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

以上的[branch-name] 是指分支名字


撤销已经git add的文件

idea  内操作选中要撤销未提交的文件 点击右键 Git -> Revert...

还原

git rm 与 git reset的区别

git rm:用于从工作区和索引中删除文件

git reset:用于将当前HEAD复位到指定状态。一般用于撤消之前的一些操作(如:git add,git commit等)。

git rm file_path 删除暂存区和分支上的文件,同时工作区也不需要

git rm --cached file_path 删除暂存区或分支上的文件, 但工作区需要使用, 只是不希望被版本控制

git reset HEAD 回退暂存区里的文件


#####     出现错误的解决方法   ######

AlandeMac-mini-2:YoPointServer alan$ git pull

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

hint: Please, commit your changes before merging.

fatal: Exiting because of unfinished merge.

错误可能是因为在你以前pull下来的代码没有自动合并导致的.

有2个解决办法:

1.保留你本地的修改

git merge --abort

git reset --merge

合并后记得一定要提交这个本地的合并

然后在获取线上仓库

git pull


可以用 git merge hotfix 把 hotfix分支合并到 master;

$ git checkout master

$ git merge hotfix

Updating f42c576..3a0874c

Fast-forward

README | 1 -

1 file changed, 1 deletion(-)


2.down下线上代码版本,抛弃本地的修改

不建议这样做,但是如果你本地修改不大,或者自己有一份备份留存,可以直接用线上最新版本覆盖到本地

git fetch --all

git reset --hard origin/master

git fetch


* git中删除文件夹的命令 git rm -rf 文件夹名

标签的使用

拉取远程分支到本地

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • (git下载地址) Git学习地址 http://www.yiibai.com/git/git_basic_con...
    52Alice阅读 437评论 0 1
  • 一、安装git linux上安装git 首先输入git,检测系统是否安装git 如果是Debian或者Ubuntu...
    Lhuo阅读 299评论 0 1
  • 1. 创建SSH Key 用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id...
    Message_id阅读 213评论 0 0
  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,756评论 0 10
  • git常用命令 1 git init 初始化2 git checkout -b dev 创建dev分支,然后切换到...
    WithUs阅读 211评论 0 0