一、本地建立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 文件夹名