如果对同一个文件做了一次修改之后,add,然后再修改一次,这时候commit只会提交第一次修改。第二次修改还得add之后再commit才会被提交。
Repository(版本库、仓库):
操作系统中的一个目录,这个目录里面的所有文件都可以被git管理起来,每个文件的修改、删除都能被git跟踪和还原。
创建仓库:
mkdir my-repo
cd my-repo
git init
检查是否有一个.git目录(注:手动改动这目录会破坏git 仓库)。
提交文件:
添加文件到仓库(文件名可以用“.”代替,表示当前目录下的所有文件):
git add ...
提交文件到仓库:
git commit -m ""
查看仓库的当前状态(是否有等待提交的文件等):
git status
查看文件修改的具体内容:
git diff
git diff HEAD
查看提交的历史记录:
git log 或:git log --pretty=oneline
查看所有操作的历史记录:
git reflog
(可以查询到每次操作对应的版本号)
提交到远程仓库:
git push origin master
删除文件:
rm
git rm
git commit -m "delete file"
撤销修改:
1、如果在本地工作区对某个文件进行修改或删除后,想撤销:
git checkout -- (让这个文件回到最近一次commit或add时的状态。相当于svn的“还原”功能。)
- 如果修改过的文件还没被add/rm到暂存区,则还原到和版本库一样(checkout版本库中的文件覆盖掉本地文件)
- 如果修改过的文件已经被add到暂存区,则还原到暂存区一样(checkout缓存区中的文件覆盖掉本地文件)
2、如果想撤销已经add到暂存区的修改(需要执行两步):
git reset HEAD (撤销暂存区中的修改)
git checkout -- (撤销工作区中的修改)
3、如果想撤销已经commit,但还没有push到远程库的修改:
需要用到“版本回退”
版本回退(相当于把HEAD指针指向另外一个位置):
回退到上个版本:
git reset --hard HEAD^
回退到指定版本号:
git reset --hard 3628164(版本号的前若干位)
参数的区别:
- soft:HEAD updated
- mixed:HEAD and index updated
- hard:HEAD, index, and working tree updated
Git分支操作:
作用:
可以在服务器创建一个自己的开发分支(跟SVN不同的是,创建分支和切换很快很方便),自己每天的代码提交到这里,等测试完之后再合并到主分支上。
创建并切换到分支"dev":
git checkout -b 'dev'
此命令相当于这两条:
git branch dev
(创建dev分支)
git checkout dev
(切换到dev分支,此时HEAD改为指向dev分支)
相当于在Eclipse上的这个操作:Team -> Switch To -> New Branch...
push本地分支到远程:
git push origin dev
查看当前分支:
git branch
切换回master分支:
git checkout master
合并dev分支上的修改到当前分支上:
git merge dev
如果没有冲突,就是fast-forward是合并,立刻完成。不过这种情况会让原来的dev分支从历史中抹掉。。。
如果不想这种情况发生,可以加个“--no-ff”参数:
git merge
--no-ff
-m "merge with no-ff" dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
如果有冲突,合并的命令会失败。这时候编辑冲突的文件,把分支上的修改弄进去,再提交、合并,就可以成功了。
查看分支合并后的情况:
git log --graph --pretty=oneline --abbrev-commit
删除dev分支:
git branch -d dev
如果该分支还没被merge,尝试删除会有错误提示,需要用-D参数强行删除:
git branch -D dev
(不过,劳动成果一般不应该删除,留着也不碍事)
分支开发:
一般是每个人在自己的分支上开发,测试完后在合并到主分支上,主分支用于发布。如下图所示:
代码临时藏匿区stash:
如果有些代码写到一半的时候,临时有紧急任务需要切换到另外一个分支上开发(比如紧急bug修复),这时候可以把尚未写完不想提交的代码临时存到stash区中去,这样就可以腾出工作区来搞临时任务。
把工作区中未提交的代码保存到stash中:
git stash
git stash -u (-u表示unchecked,包括新文件。千万不能用-a,不然
.gitignore中的文件也会被弄进去)
查看工作区是不是已经清空:
git status
如果已经清空,就可以checkout另外一个分支来干活了。
查看stash中是否有东西:
git stash list
把stash中的内容恢复到工作区中,同时清除stash中的内容:
git stash pop
这也等价于下面两条命令:
git stash apply (恢复内容到过去)
git stash drop (清空stash)
可以stash多次,这时候如果要恢复,就需要制定想恢复哪一个:
先用
git stash list看有哪几次stash;
然后:
git stash pop stash@{id}
git stash pop 等价于
git stash pop stash@{0}
查看某次stash中的详情:
git stash show stash@{id}
和远程仓库之间的操作
查看远程仓库简要信息:
git remote
查看远程仓库详细信息:
git remote -v
把本地仓库提交到远程仓库:
git push origin master
git push origin dev
第一次克隆仓库到本地的时候,只会看到master分支。
如果需要添加其他分支到本地,需要另外执行(比如dev分支):
git checkout -b dev origin/dev
该操作checkout dev分支,并切换过去。这样就可以对dev这个分支进行修改,再push到远程了。
如果提交的时候提示冲突,则应该先把远端的代码pull下来,解决冲突之后,再push
git pull
如果此时提示“no tracking information for the current branch”,则需要关联以下本地和远程分支,然后再pull:
git branch --set-upstream dev origin/dev
删除远程分支:
git push origin --delete
标签管理:
一般发布一个版本之后,会在发布的那个commit上打一个标签,以方便以后万一需要回滚的时候根据标签号找到这个版本。
查看所有的标签(按字母排序):
git tag
查看标签详情:
git show v1.0
在当前的commit上打一个新的标签:
git tag v1.0
对某个commit id打标签:
git log --pretty=oneline --abbrev-commit
git tag v0.9
打一个带说明文字的标签:
git tag -a v1.0 -m "version 1.0 released"
删除标签(本地):
git tag -d v0.9
删除远程标签:先本地删除(上面那步),然后:
git push origin :refs/tags/v0.9
推送标签到远端:
git push origin v1.0 (推送某个指定的标签)
git push origin --tags (推送所有的标签)
Eclipse 和 Git:
Eclipse中的免SSH登录设置
Window -> Preferences -> General -> Network Connections -> SSH2
- 如果之前已经生成公钥和私钥:“General”标签中,“Add Private Key...”选中那个私钥文件加入;然后把“.pub”文件中的内容追加到Git服务器的git用户home目录下(比如/home/git/.ssh)的authorized_keys文件中(也可以在“Key Management”中选择“Load Existing Key...,然后“Export Via SFTP...”到git服务器);
- 如果之前没生成公钥和私钥:选择“Key Management”标签,点击“Generate DSA Key...”或“Generate RSA Key...”,在Comment中输入一个识别标志;然后“Save Private Key...”,然后“Export Via SFTP...”到git服务器(根据提示输入 “@:”)。
Eclipse 中 checkout GIT项目:
import -> Projects from Git -> Clone URI
假设项目名为“registry”、ssh用户名为git:
URI: ssh://git@:/opt/git/registry
然后输入密码
Import as general project
项目 -> 右键 -> Configure -> Convert to Maven Project...
提交新项目到GIT:
1、ssh到Git所在的LINUX,先创建仓库:
su git
cd /opt/git
git --bare init
2、Eclipse,提交项目到服务器的仓库中:
项目 -> 右键 -> Team -> Share Project... -> GIT
勾选“Use or create repository in parent folder of project"
点击框里面的项目,点击“Create Repository”-> Next
Eclipse中设置提交时使用的邮箱和用户名:
Window -> Preferences -> Team -> Git -> Configuration
选择“User Settings”-> Add Entry...
添加:user.email, user.name
如果需要为某个项目特别指定:选择“Repository Settings”,在Repository下拉菜单中,选择一个项目,添加:user.email, user.name。
这个操作相当于以下命令:
git config user.name "myName"
相关名词(按字母排序):
- fast-forward:快速合并,当merge一个分支的时候,如果两个分支没有冲突(CONFLICT ),就执行fast-forward merge
- HEAD:指向当前的工作中的分支,或其中的commit。“HEAD^”表示上一个版本,“HEAD^^”表示上上一个版本,“HEAD~100”表示上100个版本
- master:我们创建版本库时,git为我们自动创建的第一个分支(一开始HEAD指向master)
- origin:代表被clone的远端仓库,比如“origin/master”代表远端的master分支。想向/从这个远端仓库push/pull 的时候,用 origin 指代这个远端仓库:git pull origin
- pull:本地 <-- 远程,如果本地落后远程,需要pull
- push:本地 --> 远程,如果你本地超前远程,需要push
- stage:筹划提交的暂存区
- stash:工作区代码的临时藏匿区,用于临时保存工作现场,以便腾出工作区来修改其他代码