git学习笔记

实习期间学到的最重要的东西就是版本控制与文档规范,我们Android项目最开始是使用maven构建,后来又转回了gradle,版本控制是使用的git。

第一部分  首先介绍一下常用的git命令

1.Git的初始化

(1).配置使用git仓库的人员姓名
git config --global user.name "your name"
(2).配置使用git仓库的人员email
git config --global user.email you@yourdomain.example.com

2.Git文档忽略机制
Git提供了忽略机制,可以将工作目录中不希望接受Git管理的文档信息写到同一目录下的.gitignore文件中
例如:工作目录下有个zh目录,如果不想把它加入到Git管理中,则执行:
echo "zh" >.gitignore
git add

3.Git与Repo的比较
Git操作一般对应一个仓库,而Repo操作一般对应一个项目

4.Git help获取git基本命令

5.Git init 或者使用git init-db
创建一个空的Git库。在当前目录中产生一个.git的子目录。在当前目录中产生一个.git的子目录。
以后,所有的文件变化信息都会保存到这个目录下,而不像CVS那样,会在每个目录和子目录下都创建一个CVS目录。
在.git目录下有一个config文件,可以修改其中的配置信息。

6.Git add
将当前工作目录中更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入版本历史中,这也是提交之前所需要执行的一步。
可以递归添加,即如果后面跟的是一个目录作为参数,则会递归添加整个目录中的所有子目录和文件。
例如:git add dir1(添加dir1这个目录,目录下的所有文件都被加入)
git add f1 f2 (添加f1,f2文件)
git add . (添加当前目录下的所有文件和子目录)

7.Git rm
从当前的工作目录中的索引中删除文件。
可以递归删除,即如果后面跟的是一个目录作为参数,则会递归删除整个目录中的所有子目录和文件。
例如:git rm -r * (进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录)
git rm f1 (删除文件f1,包含本地目录和index中的此文件记录)
git rm -ached f1 (删除文件f1,不会删除本地目录文件,只删除index中的文件记录;将已经git add的文件remove到cache中,
这样commit的时候不会提交这个文件,适用于一下子添加了很多文件,却又想排除其中个别文件的情况)

8.Git commit:提交当前工作目录的修改内容
直接调用git commit 命令,会提示填写注释。通过如下方式在命令行就填写提交注释:git commit -m "Initial commit of gittutor reposistory"。注意,和CVS不同,git的提交注释必须不能为空,否则就会提交失败。
git commit 还有一个 -a 的参数,可以将那些没有通过git add标识的变化一并强行提交,但不建议。
每一次提交,git就会为全局代码建立一个唯一的commit标识代码,用户可以通过git reset命令恢复到任意一次提交时的代码。
git commit --amend -m "message" (在一个commit id 上不断修改提交的内容)

9.Git status:查看版本库的状态。
可以得知哪些文件发生了变化,哪些文件还没有添加到git库中等等。要格外注意提示为"Changed but not updated;"的文件。

10.Git log:查看历史日志,包含每次的版本变化。每次版本变化对应一个commit id。
Git log -1:-1的意思是只显示一个commit,想显示5个,就-5.不指定的话,git log会从该commit 一直往后显示。
Git log --stat --summary (显示每次版本的详细变化)

11.Git merge:把服务器上下载下来的代码和本地代码合并。或者进行分支合并。
例如:当前在master分支上,若想将分支dev上的合并到master上,则git merge dev
注意:git merge nov/eclair_eocket (是将服务器git库的eclair_eocket分支合并到本地分支上)
git rebase nov/eclair_eocket (是将服务器git库的eclair_eocket分支映射到本地的一个临时分支上,然后将本地分支上的变化合并到这个临时分支,然后再用这个临时分支初始化本地分支)

12.Git diff:把本地的代码和index中的代码进行比较,或者是把index中的代码和本地仓库中的代码进行比较。
(1).Git diff:比较工作目录和index中的代码。
(2).Git diff --cached:比较Index和本地仓库中的代码。

13.Git checkout
13.1 .切换到分支
(1)创建一个新分支,并切换到该分支上:git checkout -b 新分支名
(2)切换到某个已经建立的本地分支local_branck:git checkout local_branch
(3)切换到服务器上的某个分支remote_branch:git checkout remote_branch (远程分支remote_branch可以通过git branch -r 列出)
(4)切换到某个commit id:git checkout commit_id
(5)切换到某个tag:git checkout tag
13.2 .用已有分支初始化新分支
(1)切换到某个已经建立的本地分支local_branch,并且使用此分支初始化一个新分支new_branch:
git checkout -b new_branch_local_branch
(2)切换到某个远程分支remote_branch,并且用此分支初始化一个新分支new_branch。
git checkout -b new_branch_remote_branch
(3)git checkout -b new_branch_commit_id
(4)git checkout -b new_branch_tag

14.还原代码
例如"git checkout app/model/user.rb"
就会将user.rb文件从上一个已提交的版本中更新回来,未提交的工作目录中的内容全部会被覆盖。

15.Git -ls -files:查看当前的git库中有那些文件

16.Git mv:重命名一个文件、目录或者链接
例如:git mv helloworld.c helloworld1.c (把文件helloworld.c重命名为helloworld1.c)

17.分支
git branch 列出本地git库中的所有分支。在列出的分支中,若分支名前有*,则表示此分支为当前分支。
git branch -r 列出服务器git库的所有分支。
git branch -D branck_name:删除分支。删除后,发生在该分支的所有变化都无法恢复。强制删除此分支
git diff master 分支名(比较主分支和另一个分支的区别)
git -show -branch(查看当前分支的提交注释及信息)
git -show -branch -all (查看所有分支的提交注释及信息)
git whatchanged :查看当前分支的操作记录
git merge "注释" 合并的目标分支 合并的来源分支
git pull 合并的目标分支 合并的来源分支

18.Git rebase:一般在将服务器最新内容合并到本地时使用

19.Git reset:库的逆转与恢复,除了用来进行一些废弃的研发代码的重置外,还有一个重要的作用。比如我们从远程clone了一个代码库,
在本地开发后,准备提交回远程。但是本地代码库在开发时,有功能性的commit,也有处于备份目地的commit等等。总之,commit的日志中有大量无用log,
我们并不想把这些log在提交回远程是也提交到库中,因此就要用到git reset。
它的命令形式:git reset [--mixed | --soft | --hard] [<commit -ish>]
命令的选项:
--mixed这个是默认的选项。如git reset [--mixed] dev^。它的作用仅是重置分支状态到dev1^,但是却不改变任何工作文件的内容。
即,从dev1^到dev1的所有文件变化都保留了,但是dev1^到dev1之间的所有commit日志都被清楚了,而且,发生变化的文件内容也没有通过git add标识,
如果您要重新commit,还需要对变化的文件做一次git add。这样,commit后,就得到了一份非常干净的提交记录。(回退了index和仓库中的内容)
--soft相当于做了git reset --mixed,后,有对变化的文件做了git add。就可以直接commit了。(回退了仓库中的内容)
--hard这个命令就会导致所有信息的回退,包括文件内容。一般只有在重置废弃代码时才用它。执行后,文件内容也无法恢复回来了。(回退了工作目录,index和仓库中的内容)

20.Git revert:还原某次对版本的修改
例如:git revert commit_id(其中commit_id为commit代码时生成的一个唯一表示的字符串)

21.Git config:利用这个命令可以新增、更改Git 的各种设置。
例如:git config branch .master .remote origin:就将master的远程版本库设置为别名叫做origin版本库。

22.Git show:显示对象的不同类型。

23.Git tag:创建、列出、删除或者验证一个标签对象(使用GPG签名的)。
可以将某个具体的版本打上一个标签,这样就不需要记忆复杂的版本号哈希值字符串了,
例如:git tag revert_version bbaf.....d6f29 :来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用revert_version标签名,而不是哈希值了。

24.Git clone:取出服务器的仓库的代码到本地建立的目录中(与服务器交互)
通过git clone 获取远端git库后,.git/config中的开发者信息不会被一起clone过来。任然需要为本地库的.git/config文件添加开发者信息。此外,开发者还需要自己添加.gitignore文件。
通过git clone获取的远端git库,只包含了远端git库的当前工作分支。如果想获取其它分支信息,需要使用git branch -r来查看,如果需要将远程的其它分支代码也获取过来,可以使用
git checkout -b 本地分支名 远程分支名 ,其中,远程分支名为git branch -r所列出的分支名,一般是诸如"origin/分支名"的样子。如果本地分支名已经存在,则不需要"-b"参数。

25.Git pull:从服务器的仓库中获取代码,和本地代码合并。(与服务器交互,从服务器上下载最新代码,等同于:Git fetch + Git merge)
从其它的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:git pull origin master :就是讲origin这个版本库的代码更新到本地的master主分支。
git pull可以从任意一个git库获取某个分支的内容。用法为:git pull username@ipaddr:远端repository名远端分支名 本地分支名。这条命令将从远端git库的远端分支名获取到本地git库的一个本地分支中。其中,如果不写本地分支名,则默认pull到本地当前分支。
需要注意的是,git pull也可以用来合并分支。和git merge的作用相同。因此,如果你的本地分支已经有内容,则git pull会合并这些文件,如果有冲突会报警。

26.Git push:将本地commit的代码更新到远程版本库中,例如:git push origin:就会将本地的代码更新到名为orgin的远程版本库中。
git push和git pull正好相反,是将本地某个分支的内容提交到远端某个分支上。
用法:git push username@ipaddr:远端repository名 本地分支名 远端分支名。这条命令将本地git库的一个本地分支push到远端git库的远端分支名中。
需要格外注意的是,git push不会自动合并文件。因此,如果git push时,发生了冲突,就会被后push的文件内容强行覆盖,而且没有什么提示。这在合作开发时是很危险的事情。

27.Git fetch:从服务器的仓库中下载代码。(与服务器交互,从服务器上下载最新代码)
相当于从远程获取最新代码到本地,不会自动merge,比Git pull更安全些。使用此方法来获取服务器上的更新。
例如:如果使用git checkout nov/eclair_rocket(nov/eclair_rocket为服务器上的分支名),则是获取上次使用git fetch命令是从服务器上下载的代码;
如果先使用git fetch,在使用git checkout nov/eclair_rocket,则是先从服务器上获取最新的更新信息,然后从服务器上下载最新的代码。

原文地址:https://www.cnblogs.com/evilKing/p/4419306.html