Git使用总结

1.Git

1.1创建本地版本库

版本库又名仓库(repository),简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能够跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

git init
命令创建本地版本库,创建成功后,不会在当前目录中生成一个.git隐藏的文件夹,里面包含了版本库的信息。

git add filename

filename 是包含路径的文件名,例如git add path1/path2/file1.txt
git add 命令可以多次使用,例如:
git add file1
git add file2
还可以把某个文件夹下面的所有文件都添加进“暂存区”,例如:
git add path1/path2/

git commit -m your message

your message 建议用比较有意义的名字,这样一下就知道当前改动的内容
通知执行git add 和git commit 命令就完成了当前分支的一次提交。
1.2工作区暂存区&管理修改

工作区(Working Directory)

工作区就是电脑里能看到的目录,里面的所有文件都处在工作区。

版本库

工作区有一个隐藏的.git目录,这个不算工作区,是Git版本库.Git的版本库存了很多重要的东西,其中最重要的东西就是stage的暂存区,还有Git创建的各个分支,以及指向分支的HEAD.

                                            工作区与版本库

git add操作实际上是把文件添加进暂存区stage中:
git commit操作提交更改,把暂存区的修改提交到当前分支。

1.2.1 版本回退

git log命令会列出从最近到最远的提交日志,但是不加任何参数列出的日志信息太多了,可以加上–pretty=oneline参数吧commit-id和message输出出来。

git reset 回退版本
git reset - -hard HEAD^
git reset - -hard HEAD^^
git reset - -hard HEAD~100
git reset - -hard “commit-id”

HEAD表示当前版本,HEAD^表示前一个版本,HEAD~100表示前100个版本
–hard参数表示硬回退,回退过后,后面的改动不会留在工作区。

若回退到之前的版本后,又想回退到后面的版本,可以找到后面版本的commit-id,直接git reset –hard commit-id就行了。

git reflog可以查看历史命令,可以找到所有提交的commit。

1.2.2撤销修改

git status 查看当前分支下文件的状态

Changes not staged for commit:中列出了工作区中修改的文件,但是没有提交到暂存区
Changes to be committed: 中列出了已经提交到暂存区的文件
Untraked files:中列出了没有跟踪的文件

git checkout – file.txt

把file.txt文件在工作区的修改全部撤销掉
1.一种是file.txt自修改后还没有放到暂存区,撤销修改后就回到和版本库一模一样的状态
2.一种是file.txt已经添加到暂存区后,又做了修改,现在,撤销修改就回到添加到暂存区后的状态。
 - -切忌漏掉,不写的话,就变成切换分支的命令。

git reset HEAD file

把暂存区的文件添加操作撤销掉,执行后,被修改的文件重新放回工作区,修改记录依然保存,可以在重新修改后再继续提交。

git reset HEAD .

把暂存区提交的文件全部撤销到工作区

1.2.3 删除文件

删除文件也是对文件的改动,因此删除文件同修改文件的提交时一样的。也需要将文件add到暂存区,然后commit。也可以直接执行git rm file.txt将文件删除,然后commit.

1.3 分支管理

其他的版本控制系统例如SVN也都有分支管理,但是这些系统创建和切换分支速度很慢,用起来非常不方便。但是Git的分支无论是创建、切换还是删除都可以很快的完成,无论版本库文件的多少。

1.3.1 创建与合并分支

git branch dev

基于当前分支创建dev分支,branch name可以随便取

git checkout dev

切换到dev分支

git checkout -b dev

将上述两个命令合并,创建dev分支,同时切换到dev分支

git branch

查看本地分支列表

git branch -r

查看远程分支列表

git merge dev

合并dev分支到当前分支。merge不加参数表示fast-forward快进合并,合并速度非常快,但不是每次合并都可以快进合并。

git rebase master dev

当前在master分支上,把master分支上的更新合并到dev分支上,此时会把dev分支上的commit取消掉,并保存为补丁,然后把dev分支更新到最新的master分支,最后把这些补丁应用到dev分支上,同时将当前分支切换到dev分支。若当前在dev分支上,则执行git rebase master即可实现变基。

git branch -d dev

删除dev分支

1.3.2 解决冲突

当master分支上存在一个commit记录与feature分支上的一个commit记录修改了同一行内容时,在merge的时候就会有冲突(conflicts)产生。冲突之后会有如下提示:

$ git merge feature
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

使用git status提示有哪些文件冲突

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

打开test.txt文件:

<<<<<<< HEAD
test conflicts in 5 lines in master.
=======
test conflicts in 5 lines in feature.
>>>>>>> feature

<<<<<<< HEAD 与 =======之间是master分支上的改动,=======与>>>>>>>之间是feature分支上的改动。冲突解决之后,执行git add将文件标记为已解决冲突状态,然后执行git commit “your messgae”完成合并,merge合并方式会在分支上留下合并节点。

在用git rebase命令合并代码时,遇到冲突解决的思路同merge很像。

step1.用上述方式将冲突解决掉
step2.用git add 命令将文件添加进暂存区
step3.用git rebase --continue继续rebase
若是不想继续执行rebase,则用git rebase --abort命令停止

git log - -graph

可以看到分支合并图,此时会发现,合并后会多出一个新增的commit节点。

1.3.3 Bug分支

当正在dev分支下开发时,突然接到master分支一个紧急的Bug需要处理,但是当前手头的事情还没有处理完,但是又不想提交代码,此时可以用stash命令将当前工作区暂存起来,此时工作区就是干净的,可以切换到master分支更新代码后再创建一个Bug分支处理bug.

git stash

会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。git stash save “message”可以添加额外的message。

git stash list

查看现有stash

$ git stash list
stash@{0}: WIP on master: 174edbe Merge branch 'feature'

git stash apply

通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0})

git stash drop

移除stash,例如git stash drop stash@{0}

git stash clear

清除stash list中全部的stash

git stash pop

将最后一次stash的改动重新恢复的工作区,并在stash list中将其清除.相当于是git stash apply 和 git stash drop的结合。

git stash show stash-name

查看指定缓存stash-name改动了哪些文件。后面添加参数-p查看所有文件内的修改改动。

1.4 远程仓库

git clone

按照http传输方式或者ssh传输方式将仓库从远端下载到本地。

1.4.1 git pull

取回远程主机某个分支的更新,再与本地的指定分支合并。

git pull <远程主机> <远程分支>:<本地分支>

git pull origin master

取回远程master分支,再与当前所在分支进行合并

git pull origin

如果远程分支与本地分支存在追踪关系,可以省略远程分支名
可以用git branch - -set-upstream <本地分支名> <远程主机名>/<远程分支名>,例如:
git branch - -set-upstream master origin/master

git pull

如果本地分支只存在一个追踪分支,则可以连远程主机名略胜掉。

1.4.2 git push

git push 与 git pull操作的母的相同,都是为了保持本地分支与远程分支代码同步,但是操作的目标相反。
git push <远程主机名> <本地分支名>:<远程分支名>
使用本地的对应分支更新对应的远程分支。命令中的本地分支指的是将要被推送到远端的分支,而远程分支指的是推送的目的分支,即将本地分支合并到远程分支。如果省略远程分支名,则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被创建。

git push origin master

将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。origin是远程仓库地址。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,这条命令是删除远程master分支,如下面命令所示:

$ git push origin :master
等同于
$ git push origin - - delete master

git push origin

如果当前分支与远程分支之间存在追踪关系,则本地分支名和远程分支名都可以省略。

git push

如果当前分支只有一个追踪分支,则主机名也可以省略。

git push -u origin master

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

阅读更多
文章标签: Git
个人分类: Git&Gerrit
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭