1
2
git init
git init
把这个目录变成Git可以管理的仓库
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的(查看隐藏文件command + shit + >
)
git clone
git clone <版本库的网址>
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等
需要登陆的方式
git clone
$ http://[email protected]/git/san_envproject_ios.git
$ git clone [user@]example.com:path/to/repo.git
git branch
git branch
不带参数:列出本地已经存在的分支,并且在当前分支的前面加“*”号标记git branch -r
列出远程分支git branch -a
列出本地分支和远程分支
* master
remotes/origin/master
git branch name
创建一个新的本地分支,需要注意,此处只是创建分支,不进行分支切换,当前分支还是之前的分支
比如:git branch newBranch
newBranch
为分支名git branch -m oldbranch newbranch
重命名分支,如果newbranch
名字分支已经存在,则需要使用-M
强制重命名,否则,使用-m
进行重命名git branch -d branchname
删除本地branchname
分支,必须是不在删除上的分支上才能删除git branch -D branchname
删除本地branchname
分支,必须是不在删除上的分支上才能删除git branch -d -r branchname
删除远程branchname
分支git branch -vv
查看本地分支对应的远程分支的关系,查看分支与远程分支追踪状态git branch --set-upstream-to=origin/
master
git branch --set-upstream-to=origin/Dev Dev
设置本地分支Dev跟踪origin/< Dev >远程分支
- git reflog --date=local --all | grep 要查询的分支名称
怎么查看当前的git分支是基于哪个分支创建
git checkout
git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支,也可以称为检出分支
git checkout
branchName
切换到指定分支git checkout -b
branchName
创建分支并且切换到新的分支git checkout -b 本地分支名 origin/远程分支名
这个将会自动创建一个新的本地分支,并与指定的远程分支关联起来。
例如远程仓库里有个分支dev2,我本地没有该分支,我要把dev2拉到我本地
git checkout -b dev2 origin/dev2
若成功,将会在本地创建新分支dev2,并自动切到dev2上
表示拉取不成功。我们需要先执行
git fetch
然后在执行
git checkout -b dev2 origin/dev2
- git push origin 本地分支名
这条命令表示把本地当前分支提交到远程仓库,即创建了远程分支dev
git status
git status
命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。git status不显示已经commit到项目历史中去的信息。看项目历史的信息要使用git log
git status相对来说是一个简单的命令,它简单的展示状态信息。输出的内容分为3个分类/组
1
# On branch master
# Changes to be committed: (已经在stage区, 等待添加到HEAD中的文件,已经 add 了,等待commit的状态)
# (use "git reset HEAD ..." to unstage)
#
#modified: hello.py
#
2
# Changes not staged for commit: (有修改, 但是没有被添加到stage区的文件)
# (use "git add ..." to update what will be committed)
# (use "git checkout -- ..." to discard changes in working directory)
#
#modified: main.py
#
3
# Untracked files:(没有tracked过的文件, 即从没有add过的文件)
# (use "git add ..." to include in what will be committed)
#
#hello.pyc
- 忽略文件(untracked文件)
没有tracked的文件分为两类. 一是已经被放在工作目录下但是还没有执行 git add 的, 另一类是一些编译了的程序文件(如.pyc, .obj, .exe等)
- 状态
在每次执行 git commit之前先使用git status检查文件状态是一个很好的习惯, 这样能防止你不小心提交了您不想提交的东西。 下面的例子展示 stage 前后的状态, 并最后提交一个快照
# Edit hello.py
$ git status
# hello.py is listed under "Changes not staged for commit"
$ git add hello.py
$ git status
# hello.py is listed under "Changes to be committed"
$ git commit
$ git status
# nothing to commit (working directory clean)
第一个状态输出显示了这个文件没有被放到暂存区(staged)。git add将影响第二个git status的输出, 最后一个git status告诉我们没有什么能可以提交了,工作目录已经和最近的提交相匹配了。有些命令 (如, git merge) 要求工作目录是clean状态, 这样就不会不小心覆盖更新了
git add
git add命令将文件内容添加到索引(将修改添加到暂存区)。也就是将要提交的文件的信息添加到索引库
在运行git commit命令之前,必须使用git add命令将任何新的或修改的文件添加到索引。
示列
$ git add documentation/*.txt
添加documentation目录及其子目录下所有*.txt文件的内容
$ git add git-*.sh
将所有 git-*.sh 脚本内容添加:
$ git add . # 将所有修改添加到暂存区
$ git add * # Ant风格添加修改
$ git add *Controller # 将以Controller结尾的文件的所有修改添加到暂存区
$ git add Hello* # 将所有以Hello开头的文件的修改添加到暂存区 例如:HelloWorld.txt,Hello.java,HelloGit.txt ...
$ git add Hello? # 将以Hello开头后面只有一位的文件的修改提交到暂存区 例如:Hello1.txt,HelloA.java 如果是HelloGit.txt或者Hello.java是不会被添加的
git commit
git commit命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中
git commit -m "the commit message"
git remote
为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名
git remote 命令即可,就会列出远程库的名字。在我们clone了刚才的项目之后,默认会看到一个origin的远程仓库,origin也叫主机名,Git 默认使用这个名字来标识你所克隆的原始仓库
origin
git pull
取回远程主机某个分支的更新,再与本地的指定分支合并
git pull <远程主机名> <远程分支名>:<本地分支名>
比如,要取回origin主机的next分支,与本地的master分支合并,需要写成下面这样
git pull origin next:master
如果远程分支(next)要与当前分支合并,则冒号后面的部分可以省略。上面命令可以简写为
git pull origin next
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再执行git merge
git fetch origin
git merge origin/next
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名
git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。如果当前分支只有一个追踪分支,连远程主机名都可以省略
git pull
上面命令表示,当前分支自动与唯一一个追踪分支进行合并
git fetch和git pull的区别
git fetch:相当于是从远程获取最新版本到本地,不会自动合并
$ git fetch origin master
$ git log -p master..origin/master
$ git merge origin/master
首先从远程的origin的master主分支下载最新的版本到origin/master分支上
然后比较本地的master分支和origin/master分支的差别
最后进行合并
上述过程其实可以用以下更清晰的方式来进行
$ git fetch origin master:tmp
$ git diff tmp
$ git merge tmp
git pull:相当于是从远程获取最新版本并merge到本地
git pull origin master
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些,因为在merge前,我们可以查看更新情况,然后再决定是否合并