《git使用详细介绍》由会员分享,可在线阅读,更多相关《git使用详细介绍(15页珍藏版)》请在金锄头文库上搜索。
1、git 使用详细介绍 1. Git 概念 1.1. Git 库中由三部分组成 Git 仓库就是那个.git 目录,其中存放的是我们所提交的文档索引内容,Git 可基于文档索引内容对其所管理的文档进行内容追踪,从而实现文档的版本控制。.git 目录位于工作目录内。 1) 工作目录:用户本地的目录; 2) Index(索引):将工作目录下所有文件(包含子目录)生成快照,存放到一个临时的存储区域,Git 称该区域为索引。 3) 仓库:将索引通过 commit 命令提交至仓库中,每一次提交都意味着版本在进行一次更新。 1.2. 使用 Git 时的初始化事项 1.2.1. Git 初始化配置 1) 配置
2、使用 git 仓库的人员姓名 git config -global user.name “Your Name Comes Here“ 2) 配置使用 git 仓库的人员 email git config -global user.email 1.2.2. Git 文档忽略机制 工作目录中有一些文件是不希望接受 Git 管理的,譬如程序编译时生成的中间文件等等。Git 提供了文档忽略机制,可以将工作目录中不希望接受 Git 管理的文档信息写到同一目录下的.gitignore 文件中。 例如:工作目录下有个 zh 目录,如果不想把它加入到 Git 管理中,则执行: echo “zh” .giti
3、gnore git add . 有关 gitignore 文件的诸多细节知识可阅读其使用手册:man gitignore 1.3. Git 与 Repo 的比较 Git 操作一般对应一个仓库,而 Repo 操作一般对应一个项目,即一个项目会由若干仓库组成。 例如,在操作整个 Recket 项目时使用 Repo,而操作其中的某个仓库时使用 Git。在包含隐藏目录.git 的目录下执行 git 操作。 2. Git help Git help 获取 git 基本命令 (如果要知道某个特定命令的使用方法,例如:使用 Git help clone,来获取 git clone 的使用方法)3. Git
4、本地操作基本命令 3.1. Git init 或者使用 git init-db。 创建一个空的 Git 库。在当前目录中产生一个.git 的子目录。以后,所有的文件变化信息都会保存到这个目录下,而不像 CVS 那样,会在每个目录和子目录下都创建一个 CVS 目录。 在.git 目录下有一个 config 文件,可以修改其中的配置信息。 3.2. Git add 将当前工作目录中更改或者新增的文件加入到 Git 的索引中,加入到 Git 的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步。 可以递归添加,即如果后面跟的是一个目录作为参数,则会递归添加整个目录中的所有子目录和文件。例如
5、: git add dir1 ( 添加 dir1 这个目录,目录下的所有文件都被加入 ) Git add f1 f2 ( 添加 f1,f2 文件) git add . ( 添加当前目录下的所有文件和子目录 ) 3.3. Git rm 从当前的工作目录中和索引中删除文件。 可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件。例如: git rm r * (进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录) git rm f1 (删除文件 f1,包含本地目录和 index 中的此文件记录) git rm -ached f1 (删除文件 f1,不会删
6、除本地目录文件,只删除 index 中的文件记录;将已经 git add 的文件 remove 到 cache 中,这样 commit 的时候不会提交这个文件, 适用于一下子添加了很多文件, 却又想排除其中个别几个文件的情况.) 3.4. Git commit 提交当前工作目录的修改内容。 直接调用 git commit 命令,会提示填写注释。通过如下方式在命令行就填写提交注释:git commit -m “Initial commit of gittutor reposistory“。 注意,和 CVS 不同,git 的提交注释必须不能为空,否则就会提交失败。 git commit 还有一个
7、 -a 的参数,可以将那些没有通过 git add 标识的变化一并强行提交,但是不建议使用这种方式。 每一次提交,git 就会为全局代码建立一个唯一的 commit 标识代码,用户可以通过 git reset 命令恢复到任意一次提交时的代码。 git commit -amend m “message” (在一个 commit id 上不断修改提交的内容) 3.5. Git status 查看版本库的状态。可以得知哪些文件发生了变化,哪些文件还没有添加到 git 库中等等。建议每次 commit 前都要通过该命令确认库状态。 最常见的误操作是, 修改了一个文件, 没有调用 git add 通知
8、git 库该文件已经发生了变化就直接调用 commit 操作, 从而导致该文件并没有真正的提交。这时如果开发者以为已经提交了该文件,就继续修改甚至删除这个文件,那么修改的内容就没有通过版本管理起来。如果每次在 提交前,使用 git status 查看一下,就可以发现这种错误。因此,如果调用了 git status 命令,一定要格外注意那些提示为 “Changed but not updated:”的文件。 这些文件都是与上次 commit 相比发生了变化,但是却没有通过 git add 标识的文件。 3.6. Git log 查看历史日志,包含每次的版本变化。每次版本变化对应一个 commit
9、 id。 Git log -1 -1 的意思是只显示一个 commit,如果想显示 5 个,就-5。不指定的话,git log 会从该commit 一直往后显示。 Git log -stat summary (显示每次版本的详细变化) 在项目日志信息中,每条日志的首行(就是那一串字符)为版本更新提交所进行的命名,我们可以将该命名理解为项目版本号。项目版本号应该是唯一的,默认由 Git 自动生成,用以标示项目的某一次更新。如果我们将项目版本号用作 git-show 命令的参数,即可查看该次项目版本的更新细节。例如: 1) Git log 2)Git show 实际上,上述命令并非是真正的进行版本
10、号自定义,只是制造了一个 tag 对象而已,这在进行项目版本对外发布时比较有用。 3.7. Git merge 把服务器上下载下来的代码和本地代码合并。或者进行分支合并。 例如:当前在 master 分支上,若想将分支 dev 上的合并到 master 上,则 git merge dev 注意:git merge nov/eclair_eocket (是将服务器 git 库的 eclair_eocket 分支合并到本地分支上) git rebase nov/eclair_eocket (是将服务器 git 库的 eclair_eocket 分支映射到本地的一个临时分支上,然后将本地分支上的变化
11、合并到这个临时分支,然后再用这个临时分支初始化本地分支) 3.8. Git diff 把本地的代码和 index 中的代码进行比较,或者是把 index 中的代码和本地仓库中的代码进行比较。 1) Git diff 比较工作目录和 Index 中的代码。 2) Git diff - - cached 比较 index 和本地仓库中的代码。 3.9. Git checkout 3.9.1. 切换到分支 1) 创建一个新分支,并切换到该分支上 Git checkout b 新分支名 2)切换到某个已经建立的本地分支 local_branch Git checkout local_branch (使
12、用 cat .git/HEAD 后,显示 refs:refs/heads/ local_branch) 3) 切换到服务器上的某个分支 remote_branch Git checkout remote_branch (远程分支 remote_branch 可以通过 git branch r 列出) 4) 切换到某个 commit id Git checkout commit_id (使用 cat .git/HEAD 后,显示 commit_id) 5) 切换到某个 tag Git checkout tag (使用 cat .git/HEAD 后,显示 tag) 注意: 除了 1)和 2)外,
13、其余三种都只是切换到了一个临时的( no branch )状态 (this head is detached),这时用 git branch 可以看到处于(no branch)上, cat .git/HEAD 看到指向相应的 commit id。 这个(no branch)只是临时存在的,并不是一个真正建立的branch。 如果此时执行 2),则这个(no branch)就自动消失了;如果执行 1), 则创建新分支 new branch,并把这个(no branch)挂到这个新分支上,此时 cat .git/refs/heads/new_branch 可以看到已经指向了刚才那个 commit
14、id。 3.9.2. 用已有分支初始化新分支 执行下面的命令,在切换到某个已经建立的 local branch 或者某个 remote branch 或者某个 commit id 或者某个 tag 的同时,创建新分支 new_branch,并且挂到这个新分支上。 1) 切换到某个已经建立的本地分支 local_branch,并且使用此分支初始化一个新分支new_branch。 git checkout b new_branch local_branch 2) 切换到某个远程分支 remote_branch,并且用此分支初始化一个新分支 new_branch。 Git checkout b ne
15、w_branch remote_branch 3) 切换到某个 commit id,并建立新分支 new_branch Git checkout b new_branch commit_id 4) 切换到某个 tag,并建立新分支 new_branch Git checkout b new_branch tag 3.9.3. 还原代码 例如 “git checkout app/model/user.rb” 就会将 user.rb 文件从上一个已提交的版本中更新回来,未提交的工作目录中的内容全部会被覆盖。3.10. Git-ls-files 查看当前的 git 库中有那些文件。 3.11. Gi
16、t mv 重命名一个文件、目录或者链接。 例如:Git mv helloworld.c helloworld1.c (把文件 helloworld.c 重命名为 helloworld1.c)3.12. Git branch 3.12.1. 总述 在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支。当第一次执行 git init 时,系统就会创建一个名为“master”的分支。 而其它分支则通过手工创建。 下面列举一些常见的分支策略: 创建一个属于自己的个人工作分支,以避免对主分支 master 造成太多的干扰,也方便与他人交流协作; 当进行高风险的工作时,创建一个试验性的分支; 合并别人的工作的时候,最好是创建一个临时的分支用来合并,合并完成后再“fetch”到自己的分支。 对分支进行增、删、查等操作。 注意:分支信息一般在.git/refs/目录下,其中 heads 目录下为本地分支,remotes 为对应服务器上的分支,tags 为标签。 3.12.2. 查看分支