本文假定读者对GIT有一定的基础,仅供大家在工作中碰到问题时参考所用。
Git简介
重要的术语
术语 |
定义 |
仓库 Repository |
一个仓库包括了所有的版本信息、所有的分支和标记信息。 在Git中仓库的每份拷贝都是完整的。仓库让你可以从中取得你的工作副本。 |
分支 Branches |
一个分支意味着一个独立的、拥有自己历史信息的代码线(code line)。你可以从已有的代码中生成一个新的分支 ,这个分支与剩余的分支完全独立。默认的分支往往是叫master。用户可以选择一个分支,选择一个分支叫做checkout. |
标记 Tags |
一个标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态,例如2009年1月25号在testing分支上的代码状态。 |
提交 Commit |
提交代码后,仓库会创建一个新的版本。这个版本可以在后续被重新获得。每次提交都包括作者和提交者,作者和提交者可以是不同的人。 |
URL |
URl用来标识一个仓库的位置 |
修订 Revision |
用来表示代码的一个版本状态。Git通过用SHA1 hash算法表示的id来标识不同的版本。每一个 SHA1 id都是160位长,16进制标识的字符串.最新的版本可以通过HEAD来获取.之前的版本可以通过"HEAD~1"来获取,以此类推。 |
补丁 |
指的是一个包含对源代码进行修改的文本文件。你可以将这个文件发送给某人,然后他就可以应用这个补丁到他的本地仓库。 |
索引 |
Git 需要将代码的变化显示的与下一次提交进行关联。举个例子,如果你对一个文件继续了修改,然后想将这些修改提交到下一次提交中,你必须将这个文件提交到索引中,通过git add file命令。这样索引可以保存所有变化的快照。 新增的文件总是要显示的添加到索引中来。对于那些之前已经提交过的文件,可以在commit命令中使用-a 选项达到提交到索引的目的。 |
HEAD指针 |
Git 是如何知道你当前在哪个分支上工作的呢?它保存着一个名为 HEAD 的特别指针。在 Git 中,它是一个指向你正在工作中的本地分支的指针(当前分支的别名)。 |
命令大全
配置部分
配置用户名和Email |
git config --global user.name "Example Surname" git config --global user.email "[email protected]" # Set default so that all changes are always pushed to the repository git config --global push.default "matching" |
获取Git配置信息 |
git config --list |
配置终端高亮 |
git config --global color.status auto git config --global color.branch auto |
忽略特定的文件 |
可以配置Git忽略特定的文件或者是文件夹。这些配置都放在.gitignore文件中。这个文件可以存在于不同的文件夹中,可以包含不同的文件匹配模式。为了让Git忽略bin文件夹,在主目录下放置.gitignore文件,其中内容为bin。 同时Git也提供了全局的配置,core.excludesfile。 |
使用.gitkeep来追踪空的文件夹 |
Git会忽略空的文件夹。如果你想版本控制包括空文件夹,根据惯例会在空文件夹下放置.gitkeep文件。其实对文件名没有特定的要求。一旦一个空文件夹下有文件后,这个文件夹就会在版本控制范围内。 |
新增部分
创建仓库 |
git init |
添加文件 |
git add . |
提交更改 |
git commit -m "Initial commit" git commit -a -m "These are new changes" #将未添加到索引的文件也提交 git add . && git commit -m "message" |
添加远端仓库 |
git remote add origin ../remote-repository.git |
提交到远端 |
git push origin master |
创建一个标记 |
git tag version1.6 -m 'version 1.6' |
创建一个新的分支 |
git branch testing git branch <branchname> [<start_point>]
#创建新的分支,但是不会切换到新建的分支上,如果没有指定start_point,默认#从HEAD指向的提交创建分支。 git push origin develop #提交分支到远端 |
切换分支 |
git checkout testing git checkout -b myfeature develop #创建及切换分支 git checkout -b newbranch [<start_point>] #b代表branch的意思,newbranch 是新分支的名称,如果没有指定提交点(start_point),默认从HEAD指向的提交创建分支。 |
合并两个不同分支的结果 |
#Merge通过所谓的三路合并来完成。分别来自两个分支的最新commit和两个分支的最新公共commit git merge testing |
创建补丁 |
git branch mybranch git checkout mybranch touch test05 echo "New content for test01" >test01 git add . git commit -a -m "First commit in the branch" # Create a patch --> git format-patch master git format-patch origin/master # This created patch 0001-First-commit-in-the-branch.patch git checkout master git apply 0001-First-commit-in-the-branch.patch git add . git commit -a -m "Applied patch" rm 0001-First-commit-in-the-branch.patch |
查看部分
查看修改记录(未提交) |
git log |
查看提交记录 |
git diff |
查看哪些文件做过变动(未提交) |
git status |
图形查看变更历史 |
gitk --all |
显示已有的远端仓库 |
git remote |
克隆仓库 |
git clone [email protected]:vogella/gitbook.git git clone origine |
拉取(Pull)更改 |
git pull origin master |
查看文件内容 |
less test01.txt |
列出所有的标记 |
Git tag |
列出所有本地分支,当前所在的分支前带有*号 |
git branch |
看远端仓库的分支 |
git branch -a |
修改部分
更正提交的信息 |
git commit --amend -m "More changes - now correct" |
还原更改(已加入索引) |
#如果在你的工作副本中,你创建了不想被提交的文件,你可以丢弃它。 git clean -n git clean –f # Now delete |
提取老版本的代码(把commit的内容复制到index和工作副本中) |
git checkout commit_id #通过commit ID。git log命令可以查看commit _id git revert commit_id |
还原所有未加入到索引的更改 |
#如果你还未把更改加入到索引中,你也可以直接还原所有的更改 #即使你删除了一个未添加到索引和提交的文件,你也可以还原出这个文件 git checkout test01.txt # checkout后如果没有commit id号,就是从index中拷贝数据到工作副本 |
还原HEAD所指commit |
#复制HEAD所指commit的test01文件到index中 git reset HEAD test01 #复制index中test01到工作副本中 git checkout test01 |
还原文件夹 |
如果你删除了文件夹且尚未提交,可以通过以下命令来恢复这个文件夹。译者注:即使已经提交,也可以还原 git checkout HEAD -- your_dir_to_restore |
恢复到一个标记 |
git checkout <tag_name> |
推送(push)一个分支到远端仓库 |
git push origin testing git push origin testing testing git push origin testing:testing |
解决合并冲突 |
git mergetool |
合并多个commit为一个 |
git rebase -i HEAD~7 |
Rebasing多个分支 |
#使用merge和rebase,最后的源代码是一样的,但是使用rebase产生的commit历史更加的少,而且历史记录看上去更加的线性 git branch testing git checkout testing echo "This will be rebased to master" > test01 git commit -a -m "New feature in branch" git checkout master git rebase master |
删除部分
删除文件 |
git commit -a -m "removed" git add -A . && git commit -m "removed" |
删除索引中文件(取消删除动作)。 |
如果你已经添加一个文件到索引中,但是未提交。可以通过git reset file 命令将这个文件从索引中删除 git reset incorrect.txt |
删除分支 |
git branch -d testing git push origin :branch-name #把一个空分支push到server上,相当于删除该分支(冒号前面的空格不能少)。
|
删除远端仓库引用 git remote remove origin
管理部分
谁创建了或者是修改了这个文件 |
git blame filename |
以上上个commit信息为起点,创建一条新的分支 |
git checkout -b mybranch master~1 |
附录:
1、github生成非对称密钥对命令:ssh-keygen -t rsa -C [email protected]