赞
踩
版本库又名仓库(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 建议用比较有意义的名字,这样一下就知道当前改动的内容
工作区(Working Directory)
工作区就是电脑里能看到的目录,里面的所有文件都处在工作区。
版本库
工作区有一个隐藏的.git目录,这个不算工作区,是Git版本库.Git的版本库存了很多重要的东西,其中最重要的东西就是stage的暂存区,还有Git创建的各个分支,以及指向分支的HEAD.
git add操作实际上是把文件添加进暂存区stage中:
git commit操作提交更改,把暂存区的修改提交到当前分支。
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。
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 .
把暂存区提交的文件全部撤销到工作区
删除文件也是对文件的改动,因此删除文件同修改文件的提交时一样的。也需要将文件add到暂存区,然后commit。也可以直接执行git rm file.txt将文件删除,然后commit.
其他的版本控制系统例如SVN也都有分支管理,但是这些系统创建和切换分支速度很慢,用起来非常不方便。但是Git的分支无论是创建、切换还是删除都可以很快的完成,无论版本库文件的多少。
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分支
当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节点。
当正在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查看所有文件内的修改改动。
git clone
按照http传输方式或者ssh传输方式将仓库从远端下载到本地。
取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull <远程主机> <远程分支>:<本地分支>
git pull origin master
取回远程master分支,再与当前所在分支进行合并
git pull origin
如果远程分支与本地分支存在追踪关系,可以省略远程分支名
可以用git branch - -set-upstream <本地分支名> <远程主机名>/<远程分支名>,例如:
git branch - -set-upstream master origin/master
git pull
如果本地分支只存在一个追踪分支,则可以连远程主机名略胜掉。
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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。