Git是一款免费、开源的分布式版本控制系统,用于明捷高效处理任何或小或大的项目。Git是Linus为了帮助管理Linux内核开发而开发的一个开源版本控制软件。
在Git中的绝大多数操作都只需要访问本地文件和资源,不用连网,因为Git在本地磁盘上就保存着当前项目的历史更新,所以处理起来速度很快。
如果想要看当前版本的文件和一个月前的版本之间有何差异,Git会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事。
对于任何一个文件,在Git内部都只有三种状态:已修改(modified)、已暂存(storaged)和 已提交(committed)
本地电脑存放项目文件的地方
本地项目目录中的 .git 目录称之为版本库。
.git 目录包含了两个部分,一个是暂存区(Index或者Stage),就是暂时存放文件的地方,通常使用add命令将工作区的文件添加到暂存区里。
.git 目录中还包括git自动创建的maste分支,并且将HEAD指针指向master分支。
使用commit命令可以将暂存区中的文件添加到本地仓库中。
不是在本地仓库中,项目代码在远程git服务器上,比如项目放在github上,就是一个远程仓库,通常使用clone命令将远程仓库拷贝到本地仓库中,开发后推送到远程仓库中即可。
每个项目都有一个Git目录(如果是 git clone 出来的话,就是其中 .git 的目录;如果是 git clone --bare 的话,新建的目录本身就是Git目录)。它是Git用来保存元数据和对象数据库的地方。每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫工作目录。这些文件实际上都是从 Git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。
所谓的暂存区域只不过是一个简单的文件,一般都放置Git目录中。有时会把这个文件叫做索引文件,但是标准叫法还是暂存区域。
git config --global user.name "xxx" // 配置用户名 //上传本地 repository 到服务器上的时候,在 Github 上会显示这里配置的上传者信息 git config --global user.email "xxx" // 配置邮箱 // 以上配置信息执行一次即可 git init /path // 创建本地仓库(repository),初始化 // 会在目录下创建一个 .git 目录,.git 目录里存储了所有的版本信息、标记等信息 git add xxx.html // 从本地仓库增删,结果将会保存到本机的缓存里面 git add -A // 提交全部修改 git add . // 管理全部没有被管理的文件 git commit -m "注释" // 提交,把本机缓存中的内容提交到本机的 HEAD 里面 git status // 查看状态 git log // 查看版本,以确定需要回到的时刻点 git log --pretty=oneline // 每行显示一条版本记录 git log --graph // 以简单的图的方式来显示 git reset --hard 6774dbf8d5116fa6b99875db461321b8eaad60c1 // 进行版本回退,后面的字符就是git log命令显示结果中的版本号 git reflog // 回到过去的版本号后,如果想要回到最新的版本的时候,就要用这里命令来找到最新的版本号,然后再用reset回到那个版本号 git config --list // 查看配置列表 git rm xxx // 从本地仓库删除指定文件,将文件从暂存区中删除 git rm -r xxx // 从本地仓库删除指定文件夹
git clone https://github.com/hgzerowzh/blog_website.git // 将github上的仓库克隆到本地,它内部已经起了别名了,也就是后面再进行推送的时候,已经不需要再添加了 git add readme.txt git remote add origin git@github.com:xxx/first.git // 把本地仓库和远程仓库关联起来,如果不执行这个命令,则每次 push 的时候都需要指定远程服务器的地址 git remote -v // 查看origin的相关信息 git push origin master //把本地的commit push到远程服务器 // origin 也就是之前 git remote add origin 那个命令里面的 origin,origin 替代了服务器仓库地址:git push git@github.com:xxx/first.git master // master表示推送的是本地的master分支 // 如果显示没有权限,则要去修改 .git/config文件中的origin配置段:url = https://用户名:密码@github.com/用户名/仓库名.git git pull origin master //从远程服务器pull新的改动 // 上面一个命令等同于以下两个命令: git fetch origin master git merge origin/master git push origin master //把本地的 commit push 到远程仓库中 //可以使用 .gitignore 文件忽略指定的内容 # 使用ssh认证只需要把生成的公钥上传到github上即可 // 生成公私钥:ssh-keygen -t rsa -C "注册邮箱"
# 将暂存区的文件覆盖工作目录中的文件,不加 -- 文件名 则表示覆盖全部文件 git checkout -- 文件名 # 删除工作区文件,并且也从暂存区删除对应文件的记录 git rm xxx.file # 将文件从暂存区中删除,但是工作区依然还有该文件 git rm --cached 文件名 # 取消暂存区已经暂存的文件 git reset HEAD ... git reset HEAD~2 # 往前撤销2次 # 将git仓库中指定的更新记录恢复出来,并且覆盖暂存区和工作目录 git reset --hard commitID # git reset的参数: --soft 缓存区和工作目录都不会改变,只会改变库里面的 --mixed 默认选项,缓存区和你指定的提交同步,但工作目录不会受影响(没有提交的东西需不需要保留) --hard 缓存区和工作目录都同步到你指定的提交
# 当检测到文件路径时,git reset将缓存区同步到你指定的那个提交 # 比如,下面这个命令会将倒数第二个提交中的foo.py加入到缓存区中,供下一个提交使用 git reset HEAD~2 foo.py # 运行git reset HEAD foo.py会将当前的foo.py从缓存区中移除出去, # 而不会影响工作目录中对foo.py的更改 # --soft 、--mixed、--hard对文件层面的git reset毫无作用 # 因为缓存区中的文件一定会变化,而工作目录中的文件一定不变
git branch // 查看分支 git branch 分支名称 // 创建分支 git checkout 分支名称 // 切换分支(切换指针) git merge 被合并的分支 // 合并分支,要先切回master分支,然后在master分支上合并其他分支 git branch -d 分支名称 // 删除分支,分支合并后才允许被删除,可以用-D大写强制删除 # 在删除分支的时候,一定要先退出要删除的分支,然后才能删除 git branch --merged // 查看已经被merge的分支 git branch --no-merged // 查看还没有被merge的分支
将多个提交记录整合
记录合并语法:
然后进行记录合并:
接着修改提交记录:
最后查看提交记录:
# 查看log git log # 为当前分支打上tag:v1 git tag -a v1 -m "第一版" # 将tag推送到远程仓库 git push origin --tag # 创建dev并切换到dev分支 git checkout -b dev # 把dev分支推送到远程仓库 git push origin dev
某些文件我们不想让其提交到远程仓库,此时就可以使用“忽略文件”机制来实现需求。
忽略文件需要新建一个 .gitignore的文件,该文件用于声明忽略文件或不忽略文件的规则,规则对当前目录及其子目录生效。
常见规则的写法:
/mtk/ // 过滤整个文件夹 *.zip // 过滤所有.zip文件 /mtk/do.c // 过滤某个具体文件 !index.php // 不过滤具体某个文件
# 在gitbash中键入如下命令
ssh-keygen -t rsa -C "hgzerowzh"
命令执行成功后会在 ~/.ssh/ 目录中创建一对密钥,其中以 .pub结尾是公钥。
# 将本地仓库和远程仓库关联起来 git remote add origin https://github.com/hgzerowzh/gittest.git # 将代码推送到远端仓库 git push origin master
$ git push origin master Logon failed, use ctrl+c to cancel basic credential prompt. Enumerating objects: 11, done. Counting objects: 100% (11/11), done. Delta compression using up to 4 threads Compressing objects: 100% (7/7), done. Writing objects: 100% (11/11), 910 bytes | 303.00 KiB/s, done. Total 11 (delta 2), reused 0 (delta 0), pack-reused 0 remote: Resolving deltas: 100% (2/2), done. To https://github.com/hgzerowzh/gittest.git * [new branch] master -> master
useradd -m git passwd git // 输入git用户的密码 su - git mkdir project.git cd project.git [git@c7_node_03 project.git]$ git init --bare Initialized empty Git repository in /home/git/project.git/ // 如果是 git clone 出来的话,就是其中 .git 的目录 // 如果是 git clone --bare 的话,新建的目录本身就是Git目录
mkdir git cd git/ git clone git@10.0.0.203:/home/git/project.git cd project/ echo "NO.1" > 1.html git config --global user.name "hgzero" // 设置用户名(仓库名) git config --global user.email "hgzero@qq.com" // 设置邮件地址 git add . // 将当前目录加入暂缓区 git commit -m "NO.1" // 提交到本地仓库,会输出很多欢迎信息,用于协同操作提示作用 git remote add orgin git@10.0.0.203:/home/git/project.git // 确认本地和远程的状态是否正常 git push origin master // 本地推送到远程服务器 # 然后再更新一个版本 vim 1.html // 添加点内容,做点修改 git add 1.html git commit -m "NO.2" git push
一些Git图形化工具:
Windows下安装Tortoisegit之前,需要安装msysgit,这样tortoisegit才能正常运转
更详细的Git教程:
原文:https://www.cnblogs.com/haolb123/p/14949705.html