参考:Git教程 - 廖雪峰的官方网站
SSH密钥配置
在Linux中配置ssh密钥,在Git中使用SSH协议访问Github_轻宇的博客-CSDN博客
下载以及上传仓库
【Linux】Linux下使用git上传文件到GitHub_卑微楽的开发之路-CSDN博客
一种git可视化工具
linux下可视化git工具git-cola安装与使用(SSH方式)_百里杨的博客-CSDN博客_git linux 可视化
常用命令
Git 的版本库有一个称为 Stage 的暂存区以及最后的 History 版本库,History 存储所有分支信息,使用一个 HEAD 指针指向当前分支。
- git add files 把文件的修改添加到暂存区
- git commit 把暂存区的修改提交到当前分支,提交之后暂存区就被清空了
- git reset -- files 使用当前分支上的修改覆盖暂存区,用来撤销最后一次 git add files
- git checkout -- files 使用暂存区的修改覆盖工作目录,用来撤销本地修改
存档
git init //初始化
git log //查看目前为止所有的存档
git status // 与当前存档相比, 哪些文件发生了变化
存档时,需要使用 git status
查看是否有新的文件或已修改的文件未被跟踪, 若有, 则使用 git add
将文件加入跟踪列表
git add file.c //将 file.c 加入跟踪列表
git add -A //一次添加所有未被跟踪的文件
提交全部文件可能会跟踪了一些不必要的文件, 例如编译产生的 .o
文件, 和最后产生的可执行文件. 事实上, 我们只需要跟踪代码源文件即可。为了让 git
在添加跟踪文件之前作筛选, 可以编辑 .gitignore
文件(使用 ls -a
命令查看), 在里面给出需要被 git
忽略的文件和文件类型。把新文件加入跟踪列表后, 使用 git status
再次确认. 确认无误后就可以存档了,使用
git commit -m "XXX"
提交工程当前的状态. 执行这条命令后, 将会弹出文本编辑器, 需要在第一行中添加本次存档的注释, 例如"fix bug for xxx". 应该尽可能添加详细的注释, 将来需要根据这些注释来区别不同的存档. 编写好注释之后, 保存并退出文本编辑器, 存档成功. 之后可以使用 git log
查看存档记录, 能看到刚才编辑的注释.
分支功能
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
或者git switch <name>
创建+切换分支:git checkout -b <name>
或者git switch -c <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
使用命令
git branch
查看所有分支. 其中 master
是主分支, 使用 git init
初始化之后会自动建立主分支.
使用以下命令切换分支
git checkout a9b4 //a9b4是是上文hash code的前缀,此处也可以直接用分支名
对代码的内容进行修改, 使用
git checkout -b 分支名
把修改结果保存到一个新的分支中, 如果分支已存在, 其内容将会被覆盖
此外 语句
git checkout -b dev origin/dev
表示 切换到dev分支上,接着跟远程的origin地址上的dev分支关联起来
远程分支下载到本地来
法一:先在github上新建一个仓库,然后在linux上将本地的仓库对与github仓库进行关联,当然也可选择将本地仓库与github上已有的仓库相关联。
git remote add origin https://github.com/‘git用户名’/‘git仓库名’
注意,git给远程库(即remote的意思)起的默认名称是
origin
,如果有多个远程库,比如同一个本地仓库在gitee和github上都有仓库,我们需要用不同的名称来标识不同的远程库 ,如下。git remote add gitee https://gitee.com/‘gitee用户名’/‘gitee仓库名’
完成后可以用指令git remote -v来查看不同的远程库情况;
在提交时,根据git push origin master和git push gitee master命令的不同,可以提交到不同远程库。
此外git remote rm XXX可以用来删除远程库
git add -A;
git commit -m "XXX";
git push origin master //将分支master提交
法二:如果是从零开始搭建的话,可以在github上先新建一个仓库,接着在linux上用克隆命令将仓库克隆下来
git clone git@github.com:aijianjinanyihao/vegetable-dog.git//此处放的是ssh链接
git clone -b <分支名> 仓库地址 //克隆指定分支
git add -A;
git commit -m "XXX";
后面就可以提交了
git push origin master //将分支master提交
不同的分支合并
假设已经有了分支master,要创建一个新的分支dev,并将dev修改后与master合并。
首先,我们创建dev
分支,然后切换到dev
分支:
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
然后,用git branch
命令查看当前分支:
$ git branch
* dev
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
然后,我们就可以在dev
分支上正常提交,比如对readme.txt
做个修改,加上一行:
Creating a new branch is quick.
然后提交:
$ git add readme.txt
$ git commit -m "branch test"
[dev b17d20e] branch test
1 file changed, 1 insertion(+)
现在,dev
分支的工作完成,我们就可以切换回master
分支:
$ git checkout master
Switched to branch 'master'
切换回master
分支后,再查看一个readme.txt
文件,刚才添加的内容不见了!因为那个提交是在dev
分支上,而master
分支此刻的提交点并没有变:
现在,我们把dev
分支的工作成果合并到master
分支上:
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
命令用于合并指定分支到当前分支。合并后,再查看readme.txt
的内容,就可以看到,和dev
分支的最新提交是完全一样的。
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
当然,也不是每次合并都能Fast-forward
,我们后面会讲其他方式的合并。
合并完成后,就可以放心地删除dev
分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
删除后,查看branch
,就只剩下master
分支了:
$ git branch
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master
分支上工作效果是一样的,但过程更安全。
远程库代码更新到本地仓库:git pull
git pull用法:取回远程库某个分支的更新,再与本地的指定分支合并。
git pull = git fetch + git merge
git fetch不会进行合并,执行后需要手动执行git merge合并分支,而git pull拉取远程分之后直接与本地分支进行合并。更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。
基本用法:
git pull <远程主机名> <远程分支名>:<本地分支名>
例如执行下面语句:
git pull origin master:brantest
将远程主机origin的master分支拉取过来,与本地的brantest分支合并。
后面的冒号可以省略:
git pull origin master
表示将远程origin主机的master分支拉取过来和本地的当前分支进行合并。
本地代码更新到远程库
将本地当前分支 推送到 远程指定分支上
git push origin <本地分支名>:<远程分支名>
将本地当前分支 推送到 与本地当前分支同名的远程分支上
git push origin <本地分支名>
此外如果本地库和远程库没有关联的话,需要使用语句来建立连接
git branch --set-upstream <本地分支> origin/<远程分支>