Git从零开始-日常工作不可缺少的命令

来源:互联网 发布:液晶电视机编程器 编辑:程序博客网 时间:2024/04/30 13:10

一、SVN与Git的区别

1.        Git是分布式的,而Svn不是分布的。能理解这点,上手会很容易,声明一点Git并不是目前唯一的分布式版本控制系统,还有比如Mercurial等,所以说它们差不许多。话说回来GitSvn一样有自己的集中式版本库和Server端,但Git更倾向于分布式开发,因为每一个开发人员的电脑上都有一个LocalRepository,所以即使没有网络也一样可以Commit,查看历史版本记录,创建项目分支等操作,等网络再次连接上PushServer端。

2.        Git把内容按元数据方式存储,而SVN是按文件:因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分支,版本记录等。.git目录的体积大小跟.svn比较,你会发现它们差距很大。

3.        Git没有一个全局版本号,而SVN有:目前为止这是跟SVN相比Git缺少的最大的一个特征。

4.        Git的内容的完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

5.        Git下载下来后,在OffLine状态下可以看到所有的Log,SVN不可以。

6.        刚开始用时很狗血的一点,SVN必须先Update才能Commit,忘记了合并时就会出现一些错误,git还是比较少的出现这种情况。

7.        克隆一份全新的目录以同样拥有五个分支来说,SVN是同时复製5个版本的文件,也就是说重复五次同样的动作。而Git只是获取文件的每个版本的元素,然后只载入主要的分支(master)在我的经验,克隆一个拥有将近一万个提交(commit),五个分支,每个分支有大约1500个文件的 SVN,耗了将近一个小时!而Git只用了区区的1分钟!

8.        版本库(repository):SVN只能有一个指定中央版本库。当这个中央版本库有问题时,所有工作成员都一起瘫痪直到版本库维修完毕或者新的版本库设立完成。而 Git可以有无限个版本库。或者,更正确的说法,每一个Git都是一个版本库,区别是它们是否拥有活跃目录(Git Working Tree)。如果主要版本库(例如:置於GitHub的版本库)发生了什麼事,工作成员仍然可以在自己的本地版本库(local repository)提交,等待主要版本库恢复即可。工作成员也可以提交到其他的版本库!

9.     分支(Branch)在SVN,分支是一个完整的目录。且这个目录拥有完整的实际文件。如果工作成员想要开啟新的分支,那将会影响全世界!每个人都会拥有和你一样的分支。如果你的分支是用来进行破坏工作(安检测试),那将会像传染病一样,你改一个分支,还得让其他人重新切分支重新下载,十分狗血。而 Git,每个工作成员可以任意在自己的本地版本库开啟无限个分支。举例:当我想尝试破坏自己的程序(安检测试),并且想保留这些被修改的文件供日后使用,我可以开一个分支,做我喜欢的事。完全不需担心妨碍其他工作成员。只要我不合并及提交到主要版本库,没有一个工作成员会被影响。等到我不需要这个分支时,我只要把它从我的本地版本库删除即可。无痛无痒。

10.  提交(Commit)在SVN,当你提交你的完成品时,它将直接记录到中央版本库。当你发现你的完成品存在严重问题时,你已经无法阻止事情的发生了。如果网路中断,你根本没办法提交!而Git的提交完全属於本地版本库的活动。而你只需git push)到主要版本库即可。Git其实是在执行同步Sync)。

二、Linux上安装git服务器

1.   安装git

Linux 做为服务器端系统,Windows作为客户端系统,分别安装Git

服务器端:

#yum install-y git

安装完后,查看 Git版本

[root@localhost~]# git --version

git version1.7.1

 

客户端:

下载 Gitfor Windows,地址:https://git-for-windows.github.io/

安装完之后,可以使用 Git Bash作为命令行客户端。

安装完之后,查看 Git版本

$ git--version

git version2.8.4.windows.1

 

2.   服务器端创建 Git仓库

设置/root/01_wwj/git/gittest.git Git仓库

然后把Git仓库的 owner修改为 git

[root@localhost]#mkdir -p 01_wwj/git/gittest.git

[root@localhost]#git init --bare 01_wwj/git/gittest.git

Initializedempty Git repository in /root/01_wwj/git/gittest.git

 

3.   客户端创建 SSH公钥和私钥

$ ssh-keygen-t rsa -C "wangwenjie1303@stnts.com"

此时会生成两个文件 id_rsa(私钥) id_rsa.pub(公钥)

 

4.   将客户端公钥导入服务器端 

回到 Git Bash下,导入文件:

$ sshgit@192.168.56.101 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

 

5.   客户端再次 clone远程仓库

$ git clone root@192.168.2.170:/root/01_wwj/git/gittest.git

 

三、Git基本命令使用

1.     clone现有仓库

git cloneURL (URL支持gitsshhttphttps等各种协议)

2.     git中文件的各个状态

unstaged - git仓库中没有此文件的相关记录

modified - git仓库中有这个文件的记录,并且此文件当前有改动

staged -追加,删除或修改的文件被暂时保存,这些追加,删除和修改并没有提交到git仓库

commited -追加或修改的文件被提交到本地git仓库(git仓库中大部分都是这种文件,所以git status不显示这些文件)

3.     查看git仓库中各文件状态

git status

4.     初始化一个仓库

git init

在当前文件夹下生成.git目录,完成初始化,此时此文件夹下的所有文件处于unstaged状态

5.    添加文件

git addtest.java

test.java的文件变为staged状态,其他文件还是unstaged状态

5.1 追加文件的结果1-恢复为原先状态(变为unstaged

git rm--cache test.c

5.2 追加文件的结果2-提交到git仓库(变为commited

git commit-m "my message"

6.    修改文件

test.java的状态变为modified

6.1 修改文件的结果1

git addtest.c  (暂时保存修改的内容,即变为staged

下面有2条路可以选择:
6.1.1
取消刚才的暂时保存

git resettest.c  (状态变回modified

6.2.2 将暂存的修改提交到git仓库

git commit-m "my message"

6.2 修改文件的结果2

git checkouttest.c  (将test.c恢复为git仓库中的最新版本,即变为commited状态,test.c的内容和5.2节一样)

7.    删除文件

7.1 git仓库和磁盘上删除文件

git rmtest.c  (当前目录中删除了test.c,在git仓库中暂时删除了test.c,相当于staged状态)

7.1.1 git仓库中删除test.c

git commit-m "my message"  (git仓库以后不再维护test.c)

7.1.2 删错了,恢复刚才的操作

git resetHEAD test.c  (恢复到删除前的状态,当前目录中已删除的test.c也恢复了,test.c仍文commited状态)

7.2 仅从git仓库中删除文件

git rm--cache test.c (当前目录中没有删除了test.c,仅在git仓库中暂时删除了test.c,相当于staged状态)

7.2.1 git仓库中删除test.c

git commit-m "my message"  (git仓库以后不再维护test.c,但是当前目录中仍然有test.c)

7.2.2 删错了,恢复刚才的操作

git reset HEADtest.c  (和7.1.2一样)

7.3 误删除后的恢复
如果删除了一个文件,并且commit之后发现删错了。也可以恢复,

git log  (查看各次的提交信息)

git checkoutcommit (恢复到未删除前的commint号,此时删除的文件也恢复到磁盘上了)

git checkoutmaster  (备份好删除的文件后,再回到最新状态)

8.    远程仓库的数据

5.1 获取数据

git fetch[remote-name] (获取仓库的所有更新,但是不自动合并当前分支)

git pull (获取仓库的所有更新,并且自动合并到当前分支)

5.2 上传数据

git push[remote-name] [branch-name]

example: gitpush origin master

9.    查看标签

1.1 查看所有tag

git tag

1.2 查看某个tag

git show[tag-name]

10.  新建标签

2.1 轻量级tag

git tag[tag-name]

2.2 带标注的tag

git tag -a[tag-name] -m "tag message"

2.3 后期追加tag

git log--pretty=oneline (查看所有的commit)

git tag -a[tag-name] [commit号前几位即可]

11.  删除标签

git tag -d[tag-name]

12.  提交标签到远程仓库

git push[remote-name] --tags

example: gitpush origin –tags

13.  查看和切换分支

git branch (查看所有的分支及当前处于哪个分支)

git branch-v (查看所有的分支的详细信息)

git branch --merged (查看已经合并的分支)

git branch --no-merged (查看还没合并的分支)

git checkout[branch-name] (切换到某个分支)

14.  新建分支

git branch[branch-name](新建一个分支)

git branch-b [branch-name](新建一个分支并切换到这个分支上)

15.  合并分支

git merge [branch-name]

ex. 将分支btest合并到主分支master

git checkoutmaster

git mergebtest

merge时有冲突的文件会列出来,需要手动合并

将冲突手动解决后,再次用 git status来查看是否还有 unmerged的文件。
如果没有冲突的文件,就可以git commit来提交这次合并了。

16.  删除分支

git branch-d [branch-name]

17.  远程分支相关

5.1 新建远程分支

git checkout[local_branch] (首先进入想要上传的分支)

git remoteadd [remote_repo] [remote_branch]
(
这里的[remote_branch]是远程分支的名字,一般和[local_branch]同名,
[remote_repo]
是远程仓库的名字)

5.2 向远程分支推送数据

git push[remote_repo] [remote_branch]

5.3 删除远程分支

git push[remote_repo] :[remote_branch] (注意远程分支前有个":")

18.  Git修改前一次提交的方法

git add .
git commit –amend

注:这种方式可以比较方便的保持原有的Change-Id推荐使用

19.  git pull,本地还有未commit的文件

此时,如果不想将本地文件commit(可能只是临时的修改),但是又像将远程的仓库更新下来,可以这样:

git stash #先将自己的改变保存起来

git pull #从远程仓库更新

git stash pop#将自己的修改合并到更新后的代码中

20.  版本回退

git reset --hard HEAD^ 

先用git log或者git reflog看下历史版本,然后用git reset 命令回退版本,如下:

git是用HEAD来表示当前分支中的当前版本,HEAD^表示上一个版本,HEAD^^表示上上一个版本,以此类推,如果要回退很早的版本就用HEAD@{版本号},版本号用git reflog查看。

21.  跟踪Git项目源码

gitk

1 0
原创粉丝点击