创建⼀个 Git 本地仓库对应的命令为 git init
git config [--global] user.name "Your Name" git config [--global] user.email "[email protected]"
其中 --global 是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的 Git 仓库都会使⽤这个配置。如果你希望在不同仓库中使⽤不同的 name 或 e-mail ,可以不要 --global 选项,但要 注意的是,执⾏命令时必须要在仓库⾥。
查看配置命令为:
git config -l
删除对应的配置命令为:
git config [--global] --unset user.name git config [--global] --unset user.email
⼯作区:是在电脑上你要写代码或⽂件的⽬录。
暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们 把暂存区有时也叫作索引(index)。
版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽ 是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
下⾯这个图展⽰了⼯作区、暂存区和版本库之间的关系:
图中左侧为⼯作区,右侧为版本库。Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。
由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是 在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到仓库中进⾏管理!!!
在包含 .git 的⽬录下新建⼀个 ReadMe ⽂件,我们可以使⽤ git add 命令可以将⽂件添加到暂存区:
git add [file1] [file2] ...
git add [dir]
git add .
git commit -m "message"
git commit [file1] [file2] ... -m "message"
注意 git commit 后⾯的 -m 选项,要跟上描述本次提交的 message,由⽤⼾⾃⼰完成,这部分内容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。
其中在创建的 ReadMe 文件中写入一些数据,并将该文件git add 和 git commit。
可以看到 HEAD指针指向的是 /refs/heads/master
。
而master里存储的是最近一次commit的哈希值。
其中这个哈希值可以理解成对象库的一个对象,然后可以在object文件夹里看到它
其中 哈希值要分为两个部分,前两位就是objects下的文件夹名,后面就是对应的文件名。
使用git cat-file -p 哈希值
,就可以查看到刚刚提交的信息等。
其中 tree 后面跟的哈希值是一个指向存储着文件和目录快照的树对象(tree object)的哈希值。这个树对象包含了当前提交时的文件和目录结构的信息,它指向了每个文件和子目录的对应树对象或者文件对象。通过递归地查看这些树对象和文件对象,Git 可以恢复出该提交时的完整目录结构和文件内容。所以,tree s对象在 Git 中非常重要,它记录了每个提交的文件和目录状态。
修改文件就是直接vim打开去修改文件。
git status
命令⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改。
git diff [file]
命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff 格 式。也可以使⽤ git diff HEAD -- [file]
命令来查看版本库和⼯作区⽂件的区别。
执行 git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下“回退”本质是 要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:
git reset 令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]
–mixed 为选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
–soft 参数⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
–hard 参数将区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重
可以使⽤~数字表⽰:
git reflog
会列出最近的操作历史记录,包括每次操作的提交哈希、操作类型和提交消息。
使用 git reflog
来配合使用恢复意外删除或移动的分支、标签,以及查看仓库中的操作历史通常包括以下步骤:
git reflog
来查看仓库中的操作历史记录。这将显示出每次操作的提交哈希、操作类型和提交消息。git reflog
输出,找到您意外删除或移动的分支、标签或其他引用的记录。每次操作都有一个唯一的引用标识,通常以 HEAD@{数字}
的形式显示。git checkout
或 git branch
命令来恢复引用。您可以使用 HEAD@{数字}
或引用的哈希值来指定要还原到的位置。下面是一个示例,演示如何使用 git reflog
来恢复一个意外删除的分支:
假设我们有一个名为 my-feature-branch
的分支,然后意外删除了它。我们想使用 git reflog
来找回它。
git reflog
命令来查看操作历史记录:插入代码复制代码
git reflog
这将显示出类似以下的输出,其中列出了仓库的操作历史记录:
插入代码复制代码
HEAD@{0}: checkout: moving from my-feature-branch to main
HEAD@{1}: commit: Fix bug #123
HEAD@{2}: checkout: moving from main to my-feature-branch
HEAD@{3}: commit: Implement new feature
HEAD@{4}: checkout: moving from my-feature-branch to main
HEAD@{5}: commit: Update documentation
HEAD@{6}: checkout: moving from main to my-feature-branch
HEAD@{7}: commit: Initial commit
找到删除分支的记录。在本例中,我们想要找回 my-feature-branch
,看到 HEAD@{2}
行中有一个与该分支相关的操作记录。
使用 git checkout
命令并指定记录来还原分支:
插入代码复制代码
git checkout -b my-feature-branch HEAD@{2}
这将创建一个新的名为 my-feature-branch
的分支,并将其还原到操作历史记录中 HEAD@{2}
所指定的状态。
现在,my-feature-branch
分支已成功恢复,包括了删除前的代码和提交历史。
类似的方法也可以用于恢复标签或其他引用,只需找到相应的操作历史记录并执行相应的 git checkout
命令即可。
在 Git 中,删除也是⼀个修改操作,我们实战⼀下, 如果要删除 file5 ⽂件,怎么搞呢?如果你这样做了:
但这样直接删除是没有⽤的,反⽽徒增烦恼, git status 命令会⽴刻告诉你哪些⽂件被删除了
此时,⼯作区和版本库就不⼀致了,要删⽂件,⽬前除了要删⼯作区的⽂件,还要清除版本库的⽂件。
⼀般⾛到这⾥,有两种可能:
对第⼆种情况,很明显误删,需要使⽤ git checkout 来进⾏恢复:
对于第⼀种情况,很明显是没有删完,我们只删除了⼯作区的⽂件。这时就需要使⽤ git rm
将⽂件从暂存区和⼯作区中删除,并且 commit:
使用 git checkout – 文件名
– 必须加上,不加上就是切换分支的意思了。
使用 git reset命令来回退
使用 git reset命令来回退。不过,这是有条件的,就是你还没有把⾃⼰的本地版本库推送到远程。
git branch #查看当前本地所有分⽀
git branch 分支名 #新建分⽀
git checkout -b 分支名 # 创建分支并切换到该分支
git branch -r 要查看远程分⽀需要加上-r选项。 但前提是要pull⼀下拉取最新的远端仓库,才能看到最新的内容
使⽤ git checkout
命令即可完成切换
git merge
命令⽤于合并指定分⽀到当前分⽀。合并后,master 就能看到 testbranch 分⽀提交的内容了。
合并完成后, dev 分⽀对于我们来说就没⽤了, 那么dev分⽀就可以被删除掉,注意如果当前正处于某分⽀下,就不能删除当前分⽀。
git branch -d
git branch -D
可是,在实际分⽀合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题。为了演⽰这问题,创建⼀个新的分⽀ dev1 ,并切换⾄⽬标分⽀,我们可以使⽤ git checkout -b dev1 ⼀步完成创建并切换的动作。
Fast forward 模式
Git ⽀持我们强制禁⽤ Fast forward 模式,那么就会在 merge 时⽣成⼀个新的 commit ,这样, 从分⽀历史上就可以看出分⽀信息。 --no-ff ⽅式的 git merge
这样的好处是,从分⽀历史上就可以看出分⽀信息。例如我们现在已经删除了在合并冲突部分创建的 dev2 分⽀,但依旧能看到 master 其实是由其他分⽀合并得到。
假如我们现在正在 dev2 分⽀上进⾏开发,开发到⼀半,突然发现 master 分⽀上⾯有bug需要解决。在Git中,每个bug都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除。
可现在dev2 的代码在⼯作区中开发了⼀半,还⽆法提交,怎么办?
Git 提供了 git stash 命令,可以将当前的⼯作区信息进⾏储藏,被储藏的内容可以在将来某个时间恢复出来。
注意:git stash
另外,恢复现场也可以采⽤ git stash apply 恢复,但是恢复后,stash内容并不删除,你需要 ⽤ git stash drop 来删除;
你可以多次stash,恢复的时候,先⽤ git stash list 查看,然后恢复指定的stash,⽤命令
git stash apply stash@{0}
新建远程项⽬仓库,这里以gitee为例
填写基本信息
从创建好的远程仓库中我们便能看到,刚创建的仓库有且只有⼀个默认的master分⽀
克隆/下载远端仓库到本地,需要使⽤ git clone 命令,后⾯跟上我们的远端仓库的链接,远端仓库的链接可以从仓库中找到:选择“克隆/下载”获取远程仓库链接:
ssh-keygen -t rsa -C "[email protected]" 这里必须要填你的gitee绑定的邮箱
此时使用 cd ~,进入到用户主目录中,查看是否有生成.ssh⽬录,再看看这个⽬录下有没有 id_rsa 和 id_rsa.pub 这两个⽂件
这两个就是SSH Key的秘钥对, id_rsa 是私钥,id_rsa.pub 是公钥。
git clone [email protected]:Z--J/gitcode.git
当我们在本地仓库创建了一个文件并add和commit之后,如果远程想要在远程仓库也能看到就需要git push到远程仓库。
Git 提供了 git pull 命令,该命令⽤于从远程获取代码并合并本地的版本。格式如下:
git pull <远程仓库名> <本地分支名>:<远程分支名>
//如果远程分⽀是与当前分⽀合并,则冒号后⾯的部分可以省略。git push同理
git pull <远程主机名> <远程分⽀名>
在⽇常开发中,我们有些⽂件不想或者不应该提交到远端,比如保存了数据库密码的配置⽂件,那怎么让 Git 知道呢?在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件,然后把要忽略的⽂件名填进去,Git 就会⾃动忽略这些⽂件了。 如果在创建远程仓库时没有勾选这个文件,那么在本地新建一个即可。
标签 tag ,可以简单的理解为是对某次 commit 的⼀个标识,相当于起了⼀个别名。例如,在项⽬发布某个版本的时候,针对最后⼀次 commit 起⼀个 v1.0 这样的标签来标识⾥程碑的意义。
这有什么⽤呢?相较于难以记住的 commit id ,tag 很好的解决这个问题,因为 tag ⼀定要给⼀个让⼈容易记住,且有意义的名字。当我们需要回退到某个重要版本时,直接使⽤标签就能很快定位到。
git tag [name] 哈希值
并使用git log --decorate查看到,每个提交对应的tag
给tag添加备注信息
git tag -a [name] -m "备注信息" commit_id
推送某个标签到远程,使⽤命令 git push origin