Git 基本使用

一、本地建立Git


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

$ mkdir learngit

$ cd learngit

$ pwd  /Users/alan/Documents/learngit

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

1.使用命令git add 可反复多次使用,告诉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 可以把暂存区的修改撤销掉(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

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

 git branch --set-upstream-to=origin/ 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 [email protected]: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 基本使用_第1张图片
还原

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 文件夹名

标签的使用

拉取远程分支到本地

你可能感兴趣的:(Git 基本使用)