git使用介绍
基本工作流
echo "# mcms" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin https://github.com/2217092594/mcms.git git push -u origin main
GIT对象模型:
所有用来表示项目历史信息的文件都是通过40-digit长度的SHA1值来做为对象名类似下面这样
6ff87c4664981e4397625791c8ea3bbb5f2279a3
对象
每个对象(object) 包括三个部分:类型,大小和内容。大小就是指内容的大小,内容取决于对象的类型,有四种类型的对象:"blob"、"tree"、 "commit" 和"tag"。
-
“blob”用来存储文件数据,通常是一个文件。
-
“tree”有点像一个目录,它管理一些“tree”或是 “blob”(就像文件和子目录)
-
一个“commit”只指向一个"tree",它用来标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交(commits)的指针等等。
-
一个“tag”是来标记某一个提交(commit) 的方法。
几乎所有的Git功能都是使用这四个简单的对象类型来完成的。它就像是在你本机的文件系统之上构建一个小的文件系统。
git目录与工作目录
Git目录
是为你的项目存储所有历史和元信息的目录 - 包括所有的对象(commits,trees,blobs,tags), 这些对象指向不同的分支.
git目录一般就指的根目录下的.git
$>tree -L 1 . |-- HEAD # 这个git项目当前处在哪个分支里 |-- config # 项目的配置信息,git config命令会改动它 |-- description # 项目的描述信息 |-- hooks/ # 系统默认钩子脚本目录 |-- index # 索引文件 |-- logs/ # 各个refs的历史信息 |-- objects/ # Git本地仓库的所有对象 (commits, trees, blobs, tags) `-- refs/ # 标识你项目里的每个分支指向了哪个提交(commit)
工作目录
Git的 '工作目录' 存储着你现在签出(checkout)来用来编辑的文件. 当你在项目的不同分支间切换时, 工作目录里的文件经常会被替换和删除. 所有历史信息都保存在 'Git目录'中 ; 工作目录只用来临时保存签出(checkout) 文件的地方, 你可以编辑工作目录的文件直到下次提交(commit)为止.
git安装
git日志
查看日志
git log
查看分支是基于哪个分支checkout出来的
git log --graph
其中每个点(高亮行)代表一次提交,每条线都是一次分支
回到某个提交点
git reflog 选择一个提交点,reflog可以显示七位版本号以及简略的信息
git reset --hard (七位版本号)
git配置与初始化
初始化
首先拿到一个项目是需要先初始话的,这个操作会创建一个.git的文件,里面就是暂存区。也就是add后的文件都在里面
git init
配置用户名和邮箱
使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名。
$ git config --global user.name "Scott Chacon" $ git config --global user.email "schacon@gmail.com"
这样的设置是全局设置,会影响此用户建立的每个项目.
执行了上面的命令后,会在你的主目录(home directory)建立一个叫 ~/.gitconfig 的文件. 内容一般像下面这样:
[user] name = Scott Chacon email = schacon@gmail.com
如果你想使项目里的某个值与前面的全局设置有区别(例如把私人邮箱地址改为工作邮箱);你可以在项目中使用git config 命令不带 --global 选项来设置. 这会在你项目目录下的 .git/config 文件增加一节[user]内容(如上所示).
查看用户名和邮箱
git config user.name git config user.email
配置远程地址
配置远程地址
git remote add origin xxxxxxxx
查看远程地址
git remote -v
修改远程地址
git remote set-url origin xxxxx
git重命名文件
windows系统是个大小写不敏感的
所以重命名文件如果是需要改成大写的话,需要使用临时文件的方式更改
git mv readme.md temp&& git mv temp README.md
git mv相当于执行了下面三步
$ mv README.md README $ git rm README.md $ git add README
删除文件
git mv
如果只是在工作目录中删除文件。那么他将显示(Changes not staged for commit)“未暂存的更改”,下次提交时会显示删除了改文件。
使用git rm则不会显示,使用status不会显示未暂存的更改,改文件将消失并且不再跟踪,如果文件已经修改或者添加到了暂存区,那么必须使用-f
选项强制删除
创建仓库:
git init
正常工作流
git add .
将更改的内容或者新文件添加到索引中
git staus
使用上面的或者git diff --cached 查看哪些文件将被提交
On branch master No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: txt1.txt new file: txt2.txt
git commit
提交内容
git log
查看提交的信息,这里我的提交信息为test
commit 2feb3c4a61506a1da5aa40ae740f58fd495fc8ec (HEAD -> master) Author: dragonmax <2217092594@qq.com> Date: Thu Mar 24 00:27:09 2022 +0800 test
克隆项目
首先要切换到想要存放项目的文件夹中
git clone 远程地址
远程仓库操作
添加远程仓库
git remote add 远程仓库名 远程仓库地址
查看现有的远程仓库
git remote -v origin https://gitee.com/zxldragonmax/MCMS_1.git (fetch) origin https://gitee.com/zxldragonmax/MCMS_1.git (push)
更改远程仓库地址
git remote set-url 仓库名 新地址
删除远程仓库
git remote remove 远程仓库名
拉取远程仓库更新
fetch拉取的更新会自动生成一个新的分支,之后需要切换到主分支使用merge合并,也可以使用pull暴力拉取
git fetch 远程仓库名字
推送提交到远程
git push 远程名字 本地分支名
查看某个远程仓库
git remote show 远程名
重命名远程仓库
git remote rename 旧名字 新名字
移除远程仓库地址
git remote rm 仓库名
标签操作
打标签
git tag xxx
列出标签
git tag 4.6.3 5.1 5.2.1 5.2.3 5.2.4 5.2.8
分支操作
git branch experimental
创建分支
git branch
创建experimental分支
git branch experimental
查看分支
*代表的就是当前所在的分支
experimental * master
切换分支
git checkout experimental
切换到experimental分支,并且查看当前分支,可以发现* 已经到了当前分支experimental前面
git add txt3.txt
git commit -a
在当前分支修改并提交
git log
查看信息
git checkout master
git log
退回master查看信息
合并分支merge
git merge experimental
合并“experimental”和“master”两个分支
合并分支rebase
查看分支创建时间
git reflog show --date=iso branch name
图形化查看
gitk
会有一个漂亮的图形界面显示项目历史
删除分支
这时你就可以删除掉你的 “experimental” 分支了(如果愿意):
git branch -d experimental
git branch -d只能删除那些已经被当前分支的合并的分支。如果你要强制删除某个分支的话就用git branch –D;
下面假设你要强制删除一个叫“crazy-idea”的分支:
git branch -D crazy-idea
保存工作现场
git stash
之后工作区就是干净的,这时候切换分支完成任务后再返回这个分支
git stash pop 恢复工作现场
可以多次保存工作现场,git stash list查看,git stash apply恢复,git stash drop
git使用代理
有时候需要从github推送拉取代码,这个但是国内的网络环境不太好,而且代理软件一般只在浏览器生效,使用git拉取github上的代码无法访问,如下
这个时候就需要直接在git上配置代理,让git直接走代理访问github
设置代理
git config --global http.proxy 代理地址 git config --global https.proxy 代理地址
取消代理
git config --global --unset http.proxy git config --global --unset https.proxy
查看当前已设置的代理
git config --global --get http.proxy git config --global --get https.proxy
git永久记住密码
-
使用凭据管理器: Git还提供了一种更安全的方式来管理凭据,即使用凭据管理器。这种方式允许你将凭据保存在操作系统的钥匙链(Keychain)或其他安全存储中。
-
在macOS上,可以使用
osxkeychain
来保存凭据:git config --global credential.helper osxkeychain
-
在Windows上,可以使用
manager-core
来保存凭据:git config --global credential.helper manager-core
-
在Linux上,可以使用
libsecret
来保存凭据:git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret
-
无论你选择哪种方法,Git都将记住你的凭据,并在需要时自动提供它们。这样,你就不必每次都输入用户名和密码。
请注意,虽然这些方法可以方便地记住密码,但也可能会降低安全性。因此,在选择使用这些方法时,请确保你的系统和存储设备是安全的,并仔细考虑潜在的风险。
可能有的Linux发行版不能用libsecret 某些操作系统或环境可能会限制Git存储凭据的位置。例如,在某些Linux发行版中,安全策略可能阻止使用libsecret来保存凭据。请检查相关限制并尝试选择其他凭据存储选项。
如果以上方法都没有解决问题,你可以尝试手动配置凭据。在终端中运行以下命令来存储凭据:
git config --global credential.helper store
这将在.gitconfig
文件中添加一个凭据存储配置。然后,当你第一次使用Git时,Git会要求你输入用户名和密码,并将它们保存在.git-credentials
文件中。这样,以后就不需要再次输入凭据了。
真实场景
场景一:新入职(配置查看git信息)
背景:
你新入职一个公司,用的是以前用过的电脑,环境都已经配置好,你不想重装
首先查看git配置的用户名和密码(这个很重要)因为到你提交你的代码时,是以你配置的用户名和邮箱为提交人信息的,如果你没有改的话,后期管理就会多一些障碍。
查看用户名和邮箱
git config user.name git config user.email
配置成你自己的
git config --global user.name "Your_username"
git config --global user.email "Your_email"
然后进入项目根目录下(如果需要的话),查看远程地址
git remote -v origin http://192.168.2.153:8070/parking/parking-station.git (fetch) origin http://192.168.2.153:8070/parking/parking-station.git (push)
查看当前分支
git branch
检查此项目的状态以及提交日志
git status git log
场景二:拉取项目
场景三:fork项目后的操作
fork其实是gitee或者github的功能,并不是git原生的,fork操作会复制一份目标仓库(包括文件,提交历史,issues,和其余一些东西),复制后的仓库在你自己的GitHub帐号下,这个操作是在github服务器上完成的,和本地计算机的仓库没有关系。
提交代码到原仓库中
当你在托管平台上看到了一个很有趣的项目,想要自己去改进它,然后你 fork 了它(类似克隆),最后你改了一个很厉害的功能出来,想要推给原 fork 项目,这时候你可以 pull request,一旦对方接受了你的 pull request,你的代码就有可能会出现在原 fork 项目中了
拉去原仓库的新提交
当你fork的项目有了新的更新时,你想要把新的跟新也弄过来,操作如下:(github或者gitee上只需要点一下就可以)
首先把原项目地址加入到远程源中
git remote add upstream <原仓库github地址>
拉取
git fetch upstream
fetch后会被存储在一个本地分支upstream/master上
合并
git merge upstream/master
场景四:拉取后直接开写,忘了分支,无法合并到别人的分支?
很多人都是直接拉取代码,开始一顿输出,忘了开自己的分支,更不会合并到别人的分支,这样的话就失去了git合作的意义
自己新开分支的话可以在提交前的任何时候新开分支的,要想合并到别人的分支需要先同步自己的分支内容后切换到别人的分支并拉取,再在这个分支中合并自己的分支代码,合并后推送到远程,如果想要将自己的分支也进行合并同步,需要切换到自己的分支做和之前相同的操作即可
现在将要自己新建的分支:zxl
别人的分支:new
新开自己的分支
git branch zxl
提交自己的分支内容并推送
git commit -b -m "xxxx" git push
切换到别人分支
git checkout new
拉取一下
git pull
合并你的分支到别人的分支中
git merge zxl
推送到远程
git push
完成!
场景五:commit到了错误的分支上
首先切换到错误分支上
git checkout xxx
将上一次的提交转换为放回暂存区,并且取消上次提交
git reset HEAD~1
把暂存区的文件提交到暂存栈
git stash
切换到要提交的分支上
git checkout
恢复暂存栈的代码,如果有新添加的需要再执行次add
git stash pop
最后就是正常的提交代码步骤
-
git pull
// 先更新再提交 -
git status
// 查看当前状态 -
git add .
// 添加到暂存区 -
git commit -m '提交注释'
-
git push
// 提交到远程
场景六,无法访问github
配置git代理
比如我用的clash,上面显示端口为 7890,
而据我了解我这个代理不支持https,所以选择http
配置如下:
git config --global http.proxy localhost:7890
成功
场景七,master in xxxx has no tracked branch
这是因为没有绑定本地与远程之间的关系,因为使用代码进行推送的话,完整的推送代码如下
git push 远程分支名 本地分支名
但是我们平常点击idea的推送按钮是执行的git push
,而这种默认是向绑定的分支上推送,全部由idea拉取创建的分支会由idea默认绑定
但是如果是通过命令拉取创建或者其他方式创建,是没有绑定的,所以git push
是找不到默认分支,将会报如下错误:
这个时候需要指定绑定关系,有两种方式
一,绑定到branch
1.git branch
既可以使用--set-upstream
又可以使用--set-upstream-to
,但是前者已经被弃用
用法:
git branch --set-upstream-to=origin/mybranch1 mybranch1
作用:追踪远程分支origin/mybranch1到本地分支mybranch1,如果远程没有mybranch1会报错,需要先创建远程分支
二,绑定到push上
2.git push只可以使用--set-upstream,等价与使用 -u
用法:
git push -u origin mybranch1
作用:
1.推送本地分支mybranch1到远程主机origin的mybranch1分支
2.追踪远程分支,远程没有mybranch1就自动创建一个
3.设置origin为默认主机