学习小记-Git基础

git是分布式版本控制系统,下面是创建和使用git仓库的基础知识。

0.常用命令

这部分是学习自廖永峰大大的Git教程并保存了部分常用代码,若想具体了解可略过此部分,或者直接到其个人网站进行学习:廖永峰的Git教程

  • 本地操作命令
$ git init #创建版本库
$ git add readme.txt -m "add readme.txt" #将已修改的文件提交到stage
$ git add -A  #全部添加
$ git commit #将stage文件提交到库
$ git status #查看库的状态
$ git diff #查看工作区和库的不同
$ git log #显示从近到远的提交日志

$ git reset --hard HEAD^ #上个版本HEAD^,上上个版本HEAD^^
$ git reset --hard 323224 #commit id 的前几位
$ git reflog #显示你的命令记录(里面可以显示commit id)

$ git checkout -- readme.txt  #将工作区文件的修改撤销(至和库中一样),如果已经add过则是和stage中一样,(也可用作工作区误删文件恢复)
$ git reset HEAD readme.txt  #将stage中的修改撤回到工作区,HEAD表示最新版本

$ git rm readme.txt  #删除库中文件
  • 远程仓库
$ ssh-keygen -t rsa -C "youremail@example.com"  #创建SSH Key
$ cd .ssh  #之后打开id_rsa.pub复制ssh key到github中创建newkey,此处不再赘述,若有问题请百度
$ git remote add origin git@github.com:michaelliao/learngit.git  #在github官网创建新库后将本地库关联到github
$ git push -u origin master  #将本地commit push到github(第一次提交后可省略 -u)
$ git push origin dev-test  #将本地分支push到github(在github上创建新分支)
$ git clone git@github.com:michaelliao/gitskills.git  #克隆github上的库到本地
  • 分支
$ git checkout -b dev  #创建并切换到一条名为dev的branch
$ git merge dev  #将dev中的commit合并到master
$ git branch -d dev  #将dev删除, -D强行删除
$ git log --graph --pretty=oneline  #冲突要手动修改后再提交
$ git merge --no-ff -m""  #合并分支禁用Fast Foward后生成新的commit

$ git stash  #为了解决Bug分支隐藏工作现场
$ git stash list  #查看stash列表
$ git stash apply stash@{0}  #恢复指定的stash
$ git stash pop  #恢复工作现场并删除stash,也可用drop

$ git checkout -b dev origin/dev  #创建github上的远程分支dev到本地
$ git branch --set-upstream dev origin/dev  #遇到冲突时需要先设置本地和远程分支路径,然后pull, 之后再合并,冲突的修改模式和本地相同
$ git pull
 - 多人协作的工作模式通常是这样:
     - 首先,可以试图用git push origin branch-name推送自己的修改;
     - 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
     - 如果合并有冲突,则解决冲突,并在本地提交;
     - 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
     - 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
  • 标签
$ git tag v0.9 6224937  #创建tag,默认为HEAD,也可以打在一个指定的commitid
$ git tag -a <tagname> -m "blablabla..."  #指定标签信息
$ git tag  #查看所有标签
$ git tag -d v0.1  #删除标签

$ git push origin <tagname>  #标签不会自动推送到远程,需要手动推送
$ git push origin --tags  #一次性推送所有标签
$ git push origin :refs/tags/<tagname>  #删除远程标签
  • github的使用
    先fork到自己的仓库,然后clone自己的仓库到本地,这样你才能推送修改。

一、初始化

git配置

使用git config命令进行配置:

$ git config --global user.name "Scott Chacon"
$ git config --global user.email "schacon@gmail.com"

执行了上面的命令后,会在家目录(/home/shiyanlou)下建立一个叫.gitconfig 的文件(该文件为隐藏文件,需要使用ls -al查看到). 内容一般像下面这样,可以使用vim或cat查看文件内容:

$ cat ~/.gitconfig
[user]
        email = schacon@gmail.com
        name = Scott Chacon

上面的配置文件就是Git全局配置的文件,一般配置方法是git config –global <配置名称> <配置的值>。

二、获得一个git仓库

1.Clone

为了得一个项目的拷贝(copy),我们需要知道这个项目仓库的地址(Git URL). Git能在许多协议下使用,所以Git URL可能以ssh://, http(s)://, git://. 有些仓库可以通过不只一种协议来访问。
克隆方式:

$ git clone http://git.shiyanlou.com/shiyanlou/gitproject

clone操作完成后,会发现当前目录下多了一个gitproject文件夹,这个文件夹里的内容就是我们刚刚clone下来的代码。

2.初始化一个新的仓库

可以对一个已存在的文件夹用下面的命令让它置于Git的版本控制管理之下。

创建代码目录project:

$ cd /home/shiyanlou/
$ mkdir project

进入到代码目录,创建并初始化Git仓库:

$ cd project
$ git init

Git会输出:

Initialized empty Git repository in /home/shiyanlou/project/.git/

通过ls -la命令会发现project目录下会有一个名叫.git 的目录被创建,这意味着一个仓库被初始化了。可以进入到.git目录查看下有哪些内容。

三、git的工作流程

git的基本流程如下:

  1. 创建或修改文件
  2. 使用 git add 命令添加新创建或修改的文件到本地缓存区(Index)
  3. 使用 git commit 命令提交到本地代码库
  4. (可选,有时候并没有可以同步的远端代码库)使用 git push 命令将代码同步到远端代码库
    进入我们刚才建立的project目录,分别创建文件file1,file2,file3:
$ cd project
$ touch file1 file2 file3

修改文件,可以使用vim编辑内容,也可以直接echo添加测试内容。

$ echo "testcontent1" >> file1
$ echo "testcontent2" >> file2
$ echo "testcontent3" >> file3

此时可以使用git status命令查看当前git仓库的状态:

$ git status
On branch master

Initial commit

Untracked files:
   (use "git add <file>...") to include in what will be committed)

       file1
       file2
       file3
nothing added to commit but untracked files present (use "git add" to track)

可以发现,有三个文件处于untracked状态,下一步我们就需要用git add命令将他们加入到缓存区(Index)。

使用git add命令将新建的文件添加到:

$ git add file1 file2 file3

然后再次执行git status就会发现新的变化:

$ git status
On branch master

Initial commit

Changes to be committed:
    (use "git rm --cached <file>..." to unstage)

       new file: file1
       new file: file2
       new file: file3

你现在为commit做好了准备,你可以使用 git diff 命令再加上 –cached 参数,看看缓存区中哪些文件被修改了。进入到git diff –cached界面后需要输入q才可以退出:

$ git diff --cached

如果没有–cached参数,git diff 会显示当前你所有已做的但没有加入到索引里的修改。

如果你要做进一步的修改, 那就继续做, 做完后就把新修改的文件加入到缓存区中。

当所有新建,修改的文件都被添加到了缓存区,我们就要使用git commit提交到本地仓库:

$ git commit -m "add 3 files"

需要使用-m添加本次修改的注释,完成后就会记录一个新的项目版本。除了用git add 命令,我们还可以用下面的命令将所有没有加到缓存区的修改也一起提交,但-a命令不会添加新建的文件。

$ git commit -a -m "add 3 files"

再次输入git status查看状态,会发现当前的代码库已经没有待提交的文件了,缓存区已经被清空。

至此,我们完成了第一次代码提交,这次提交的代码中我们创建了三个新文件。需要注意的是如果是修改文件,也需要使用git add命令添加到缓存区才可以提交。如果是删除文件,则直接使用git rm命令删除后会自动将已删除文件的信息添加到缓存区,git commit提交后就会将本地仓库中的对应文件删除。

这个时候如果本地的仓库连接到了远程Git服务器,可以使用下面的命令将本地仓库同步到远端服务器:

$ git push origin master

这时候可能需要你输入在Git服务器上的用户名和密码。

四、分支与合并

Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。

1.分支

一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫 experimental的分支:

$ git branch experimental

运行git branch命令可以查看当前的分支列表,已经目前的开发环境处在哪个分支上:

$ git branch
 experimental
* master

experimental 分支是你刚才创建的,master分支是Git系统默认创建的主分支。星号标识了你当工作在哪个分支下,输入git checkout 分支名可以切换到其他分支:

$ git checkout experimental
Switched to branch 'experimental'

切换到experimental分支,切换完成后,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支:

# 修改文件file1
$ echo "update" >> file1
# 查看当前状态
$ git status
# 添加并提交file1的修改
$ git add file1
$ git commit -m "update file1"
# 查看file1的内容
$ cat file1
test
update
# 切换到master分支
$ git checkout master

查看下file1中的内容会发现刚才做的修改已经看不到了。因为刚才的修改时在experimental分支下,现在切换回了master分支,目录下的文件都是master分支上的文件了。

现在可以在master分支下再作一些不同的修改:

# 修改文件file2
$ echo "update again" >> file2
# 查看当前状态
$ git status
# 添加并提交file2的修改
$ git add file2
$ git commit -m "update file2 on master"
# 查看file2的内容
$ cat file2
test
update again

这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?

可以通过下面的git merge命令来合并experimental到主线分支master:

# 切换到master分支
$ git checkout master
# 将experimental分支合并到master
$ git merge  -m 'merge experimental branch' experimental

-m参数仍然是需要填写合并的注释信息。

由于两个branch修改了两个不同的文件,所以合并时不会有冲突,执行上面的命令后合并就完成了。

如果有冲突,比如两个分支都改了一个文件file3,则合并时会失败。
首先我们在master分支上修改file3文件并提交:

# 切换到master分支
$ git checkout master
# 修改file3文件
$ echo "master: update file3" >> file3
# 提交到master分支
$ git commit -a -m 'update file3 on master'

然后切换到experimental,修改file3并提交:

# 切换到experimental分支
$ git checkout experimental
# 修改file3文件
$ echo "experimental: update file3" >> file3
# 提交到master分支
$ git commit -a -m 'update file3 on experimental'

切换到master进行合并:

$ git checkout master
$ git merge experimental
Auto-merging file3
CONFLICT (content): Merge conflict in file3
Automatic merge failed; fix conflicts and then commit the result.

合并失败后先用git status查看状态,会发现file3显示为both modified,查看file3内容会发现:

$ cat file3
test
<<<<<<< HEAD
master: update file3
=======
experimental: update file3
>>>>>>> experimental

上面的内容也可以使用git diff查看,先前已经提到git diff不加参数可以显示未提交到缓存区中的修改内容。

可以看到冲突的内容都被添加到了file3中,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file3和git commit命令来提交合并后的file3内容,这个过程是手动解决冲突的流程。

# 编辑冲突文件
$ vim file3
# 提交修改后的文件
$ git add file3
$ git commit -m 'merge file3'

当我们完成合并后,不再需要experimental时,可以使用下面的命令删除:

$ git branch -d experimental

git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D

2.撤销一个合并

如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:

$ git reset --hard HEAD^
# 查看file3的内容,已经恢复到合并前的master上的文件内容
$ cat file3

3.快速向前合并

还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。

但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前”(fast forward)操作;git 不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。

五、git日志

(此处不做赘述,如有需要会补充)

$ git log

六、比较内容

1.比较提交

$ git diff #比较提交内容
$ git add * #将所有内容提交到缓存区
$ git diff --cached #比较缓存区和上一次提交的内容

2.比较分支

在任何分支中使用,比较与其他分支的区别

$ git diff test master #比较test和master分支内容

也可以在master分支中比较与其他分支的区别,可以加上特定路径限定符,只比较一个文件或目录

$ git diff test file1 #在master中使用此命令,之比较file1两分支的区别
$ git diff test --stat #统计哪些文件被改动,改动了多少行

七、分布式工作流程

$ git pull git... #将公共仓库中的主分支更改pull到本地
$ git push ssh://yourserver.com/~you/proj.git master #将修改推送到公共仓库中

如果push失败,可能是进行本地修改的同事仓库已经变化了,需要先进行pull后再push

八、git标签

(待补充..)

小结

git config:配置相关信息
git clone:复制仓库
git init:初始化仓库
git add:添加更新内容到索引中
git diff:比较内容
git status:获取当前项目状况
git commit:提交
git branch:分支相关
git checkout:切换分支
git merge:合并分支
git reset:恢复版本
git log:查看日志

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值