赞
踩
官网: GIT Download下载 安装过程中一路默认即可。
终端输入
git -v
查看git安装是否成功。
(可选)然后下载一个Git
状态显示到powershell
中的非常好用插件,posh-Git(windows):
用管理员身份打开powershell
,之后输入
Set-ExecutionPolicy RemoteSigned #一路 Yes
Install-Module -Name posh-git -Scope CurrentUser
重启powershell
Import-Module posh-git
初始化仓库的文件位置会加一个GIT位置就对了。
注意要初始化仓库之后才有这个main
标志。
想要每次重启都不用再输入
Import-Module posh-git
就如下添加一个powershell
配置文件,我们一般开shell
输入的都是临时变量,不会保存,这个文件的作用是每次打开shell
都会执行一遍其中代码。
$profile # 显示 Windows PowerShell 配置文件的路径
test-path $profile # 确定是否已经在系统上创建了 Windows PowerShell 配置文件,如果存在配置文件,则响应为 True:否则响应为 False。
new-item -path $profile -itemtype file -force # 创建 Windows PowerShell 配置文件
之后按照路径打开该文件,把代码添加进去。
Import-Module posh-git
其中:
[master +1 ~0 -0 !]
这是Git的分支状态指示符,提供了关于当前Git仓库状态的一些信息:
master:这是当前所在的分支。
+1:表示有一个文件被添加到了暂存区。
~0:表示没有文件被修改但未暂存。
-0:表示没有文件被删除但未暂存。
!:表示有文件被修改但未追踪。
# 配置用户名和邮箱
git config --global user.name "Winston"
git config --global user.email "你的邮箱"
# cd到需要创建仓库的位置
git init
ls -h # 应该有一个隐藏的.git文件夹
mac命令,windows手动删吧:\rm -rf .git # 删除仓库 注意.git就是仓库的主要文件,删除就相当于删除仓库配置
git init my_repo # 在该文件夹下创建一个新文件夹,并初始化它成为仓库
# cd到需要创建仓库的位置
git clone 仓库网址
ls -h # 应该有一个隐藏的.git文件夹
工作区 暂存区 本地仓库 远端仓库
git add
git commit
git push
# cd到需要创建仓库的位置
git clone 仓库网址
# 查看仓库处在哪个分支,仓库下有那些文件,和文件的状态
git status # 其中 UIntracked file就是未被跟踪的文件,显示为红色
git add . # 把当前文件夹下的所有文件都加入到暂存区,等待后续操作。这里的.表示当前目录。
git add *.txt # 把所有txt文件都加入到暂存区
git add file.txt # 加入之后会有提示说Changes to be committed指的是有暂存区的文件没有提交到本地仓库,处于已修改状态。
git rm --cached file.txt # 把文件从暂存区中移除
git commit -m '提交信息' # 把暂存区的文件提交到本地仓库
git commit -a -m "提交信息" # 一行命令执行添加暂存和提交, 只对已经添加过的文件生效,新文件不能用这个命令
git log # 查看提交记录和提交信息
git log --oneline # 查看简洁提交记录
git reset --soft 版本号 # 回退到某一个版本,并且保留工作区和暂存区的所有修改内容
git reset --hard 版本号 # 回退到某一个版本,并且丢弃工作区和暂存区的所有修改内容
git reset --mixed 版本号 # 回退到某一个版本,只保留工作区修改内容,丢弃暂存区的修改内容 default 参数
# 回退实例
git reset --soft 5af90b8 # 软回退到5af90b8版本
git reset --hard HEAD^ # 硬回退到上一版本
soft
参数回退之后,HEAD
指针指向回退的版本,提交历史变少,工作区和暂存区内容都多于本地仓库,相当于只是把commit
操作撤回了。并且git reset --soft HEAD^
git status # 提示有需要提交的文件
ls # 文件与回退之前一致
git ls-files # 查看暂存区文件,与回退之前一致
hard
参数回退之后,HEAD
指针指向回退的版本,提交历史变少,工作区和暂存区内容都等于本地仓库,相当于立刻回到之前的状态,完全扔掉两次提交之间的任何修改。并且git reset --soft HEAD^
git status # 没有工作要做
ls # 文件比回退之前少了,与回退到的那个版本当时一样多
git ls-files # 查看暂存区文件,文件比回退之前少了,与回退到的那个版本当时一样多
mix
参数回退之后,HEAD
指针指向回退的版本,提交历史变少,工作区内容多于本地仓库而暂存区一样多,相当于只把两次之间的差异保留在了工作区。并且git status # 提示有未跟踪的文件
ls # 文件与回退之前一致
git ls-files # 查看暂存区文件,文件比回退之前少了,与回退到的那个版本当时一样多
这里mixed
和soft
有一个用法就是,多次提交想合并的时候,回退到想要保留为上一个版本的那一版,然后重新提交,这样即保留了所有修改,又能合并修改。
另外hard
参数回退会删除所有相关修改,谨慎使用,但其实我们仍然可以恢复这些修改,只能说GIT牛逼。毕竟文件应该没有多大,修改也不会幅度太大,因此存储的占用应该保留上一个版本都不是问题。
使用:
git reflog # 查看操作的历史记录,查看想要回溯的GIT版本
git reset --n hard 想要回溯的GIT版本 # 回到想要回溯的GIT版本
通过 git diff
查看工作区,暂存区,本地仓库之间差异。还可以查看文件在两个特定版本之间的差异。或者文件在两个分支之间的差异。
git diff # 默认比较工作区和暂存区之间的差异内容 红色的文字是删除的内容,绿色是新加的内容
git diff HEAD # 比较工作区和版本库之间的差异内容
git diff --cached # 比较暂存区和版本库之间的差异内容
git diff 第一个版本id 第二个版本id # 比较两个版本之间的差异内容
git diff 5aF90qb HEAD # 比较5aF90qb版本和现版本的差异
git diff 5aF90qb HEAD file.txt # 只查看这个文件的差异内容
git diff 分支1 分支2 # 查看两个分支的差异
可以用HEAD
表示当前版本,HEAD~ / HEAD^
表示上一个版本, HEAD~3
表示往前数三个版本。
HEAD和ID的前后顺序不同,最后产生的结果就不同,我习惯后面写靠后的版本。
方法一:
rm file.txt # 也可以手动删除本地文件
git status # 提示我们 deleted
git add . # 删除文件也是通过add进行的,这里也可以用file.txt代替.
git commit -m "提交信息"
这个方法会麻烦一些,git
提供了另一种方法。
方法二:
git rm file.txt # 同时在工作区和暂存区删除该文件
git commit -m "提交信息"
若想只删除暂存区文件,保留本地文件,加--cached
参数
git rm --cached file.txt # 若想只删除暂存区文件,保留本地文件,加--cached参数
通过.gitignore
文件忽略文件,直接在文件里写文件名。
忽略文件的类型:
可以用通配符忽略所有的log文件:*.log
可以忽略文件夹:temp/
.gitignore
文件生效的前提是忽略的这个文件不能是已经被添加到版本库中的文件
GitHub
管理代码,在GitHub
官网注册并登录账号。+号创建仓库。Git Bash
# 默认在根目录下
ssh-keygen -t rsa -b 4096 # 之后一直回车一路到底。
找到目录C:\Users\Winston\.ssh
(用自己的用户名替换Winston)中的私钥(id_rsa
)和公钥(id_rsa.pub
)文件。
在GitHub
中点击头像
->Settings
->SSH and GPG keys
->New SSH key
把id_rsa.pub
中的公钥复制到Key
中,新建Key
如果成功应该在如下Git Bash
中输入ssh -T git@github.com
后输出successfully
这里的ssh应该是一个私钥加密公钥解密的过程,目的是确定操作者是你。
而公钥加密私钥解密的过程是为了不让别人看到。
git remote add origin(这是一个仓库的名称,后面用不到所以都命名为origin就行) 仓库地址 # 将本地仓库连接到远程仓库
git remote -v # 查看本地仓库对应的远程仓库别名和地址
git branch -M main # 指定分支名称为main
git push -u origin main:main # -u表示初始化push,将本地的main分支和远程origin仓库main分支进行关联,如果两者分支名相同,写一个就行
git push origin main:main # 将本地的main分支和远程origin仓库main分支进行关联,如果两者分支名相同,写一个就行
-u
这个标志设置跟踪信息。使用-u
,git
会记住远程仓库和分支的信息,这样以后你就可以简单地运行git push
而不必指定分支和远程仓库。
git push # 将本地的main分支推送到远程origin仓库main分支
git push origin main:main # 当然你也可以写全,这一行与上一行是一个意思,因为初始化时已经进行了指定分支和仓库
# 如果不写默认仓库名和分支名,默认拉取的是origin仓库的main分支
git pull origin main:main # 将本地的main分支和远程仓库main分支进行关联,如果两者分支名相同,写一个就行
需要注意git
会对pull
下来的远程仓库文件和本地文件进行合并,如果有冲突就不会合并,会要求解决冲突。
git fetch # 另一种拉取方式,但是不会合并,需要我们手动合并。
git branch # 查看仓库中的所有分支
git branch -r # 查看远程仓库的所有分支
git branch winston # 创建新的分支
git switch winston # 切换到新的分支
git branch -d winston # 删除分支
git checkout -b winston 想要恢复的winston分支提交ID # 恢复分支
git log --oneline --graph --decorate --all # 查看提交ID
当前所在分支是合并之后的目标分支,命令之后的分支是需要合并到当前分支的分支。
git switch main # 切换到目标分支
git merge winston # 将winston分支合并到main分支
git log --graph --oneline --decorate --all # 查看分支图,在图形化界面上显示更为美观
分支合并之后还是存在的,如在main
中合并winston
,winston
仍存在,内容和合并前一致,如果不需要可以手工删除。
git branch -d winston # 删除这个分支,-d表示这个分支已经完成了合并,没有被合并的话就会被拒绝
git branch -D winston # 强制删除这个分支,即使未合并
合并分支后日志里的显示是两个分支的所有日志按照时间顺序排序生成的新日志。
如果两个版本改变了同一个文件的同一行代码,就需要解决冲突。(实测如果winston
在第3行末尾追加了代码,main
添加了一行代码作为第4行,合并时也会出现冲突)
git switch main # 切换到目标分支
git merge winston # 将winston分支合并到main分支
git
报错说有冲突。
git status # 冲突文件列表
git diff # 冲突的具体内容
文件中等号上面部分是main
分支的修改内容,下面是winston
分支的修改内容。接下来我们编辑这个加入了等号和箭头的文件。
vi file.txt
git add .
git commit -m "merge conflict"
git merge --abort
rebase
命令和merge
有一定相似度,merge
是合并两个分支,rebase
是变基如下图:
git switch dev
git rebase main # 将dev分支以main分支为基
变基前 | 变基后 |
---|---|
git switch main
git rebase dev # 将main分支以dev分支为基
变基前 | 变基后 |
---|---|
最主要的区别有两点:
rebase
变基不像merge
按照时间顺序对多次提交进行合并,而是直接把一条分支的提交记录嫁接到另一条分支上。rebase
不会产生额外的提交记录,形成线性历史;而merge
会产生一个合并的提交记录,分支图复杂。这里我们在分支r上进行了三次提交
需要将三次提交的文件内容保留,而提交记录合并,并且把提交信息整合成一个,用如下三个命令是等价的:
git rebase -i 6b837bd8e38c02e60f5bc2838c6dd5a82e73364f # -i后面跟的是不需要合并的版本号
git rebase -i HEAD~3 # 合并近三次提交(包括HEAD指向的最近提交)
git rebase -i HEAD^^^ # 合并近三次提交(包括HEAD指向的最近提交)
之后单击i
按键,进入编辑模式,注意到有一行注释写的是s, squash <commit> = use commit, but meld into previous commit
,意思是保留那一次提交,但是融入到之前的提交中,因此我们只保留第一个pick
,后面的都改写成s
。
然后我们ESC
退出编辑模式,shift + :
输入wq
回车保存并退出,就会出现如下界面:
我们随便选择一行作为最后提交信息的输出行,其余的都打上#
。
Successfully rebased and updated refs/heads/r.
最后用git push -f
命令强制推送到远端就可以了。
git push -f
git checkout
命令用于更新工作区的文件使它们和指定提交或暂存区保持一致,撤销修改,也就是会从指定提交或暂存区中拷贝文件到工作区替换掉原有的文件,也可用于切换分支。
git checkout -- <file>
--
的作用是表明其后的内容是目录或文件,而不是分支名,避免有文件名和分支名一样而出错的情况,在保证不会混淆的情况下,可以直接使用以下命令:
git checkout <file>
git checkout <commit> <file>
上面命令中的 file 不一定只是一个确定的文件名,也可以是目录,还可以是匹配多个文件名的模式,比如 *.py 匹配所有以 .py 结尾的文件。
需要注意的是,这样的撤销操作不能找回之前修改的内容了,因此可以采用git stash
将更改保存到一个临时堆栈中,之后用git stash pop / git stash apply
恢复。
进一步,需要撤销当前目录的所有修改,可以用如下命令:
git checkout . # 撤销当前目录(和子目录)的所有文件修改,使它们和暂存区保持一致:
git checkout HEAD . # 撤销当前目录(和子目录)和对应的暂存区的所有文件修改,使它们和当前提交保持一致:
更新当前目录(和子目录)的所有文件,使它们和暂存区保持一致:
git checkout <commit>
# 看文件内容
git checkout main
如上代码相当于先将HEAD
指针指向那一次的提交,之后重新指向最新的main
指针上。
使用以下命令创建分支的同时切换到该分支:
git checkout -b <branch> [<start-point>]
git checkout -B <branch> [<start-point>]
可以指定新分支基于哪一个提交start-point
建立。
-B
选项的特殊之处在于如果要创建的分支已经存在,那么会把该分支重置到指定的start-point
上,而-b
选项则无法创建,会提示分支已经存在。
git checkout main # 切换到本地分支
git fetch # 获取远程分支的最新状态 记住只会拉取当前分支的最新内容
git merge # merge 默认合并对应的远程分支
git add <解决冲突后的文件>
git commit # 解决合并冲突(如果有的话)
git push origin main
如果确定没有冲突,可以采用一行代码解决
git pull # 记住只会拉取当前分支的最新内容
如果开发过程中只有一个main分支的话,我们就直接pull下来main的最新状态就行了。
其实git pull = git fetch + git merge
git fetch
的功能是同步,同步后,origin/master指针变化,而本地master指针不变化。
同步前 | 同步后 |
---|---|
# 更新 main 分支 git checkout main git fetch # 获取远程分支的最新状态 记住只会拉取当前分支的最新内容 git merge # merge 默认合并对应的远程分支 或 git pull # 更新 winston 分支 git checkout winston git fetch # 获取远程分支的最新状态 记住只会拉取当前分支的最新内容 git merge # merge 默认合并对应的远程分支 或 git pull # 将main分支合并到winston分支中 git merge main git add <解决冲突后的文件> git commit # 解决合并冲突(如果有的话) git push origin winston
然后就可以提交一个winston分支合并到远程main分支的MR了。其实提交MR的话,我们不合并main最新版本到我们的分支中也是可以接受的,因为leader会帮我们检查合并是否有冲突,然后解决冲突,也就是每个人的修改最后汇总到负责人那里进行最后的合并操作。
git remote # 可以查看远程仓库名字
# 之后我们可以直接合并远程仓库的内容到我们的本地分支上
git checkout dev # 切换到 dev 分支
git fetch # 获取远程分支的最新状态
git merge origin/main # 合并远程的main到我们本地的dev分支上
git stash # 这会保存当前工作目录和暂存区的所有修改,并将工作目录恢复到上一次提交的状态。
git stash list # 这会显示所有保存的修改,以便你可以选择恢复特定的保存点
git stash pop stash@{n} # 这里的 n 是保存点的索引,你可以从 git stash list 命令中获得。
git stash pop # 这会应用最近一次保存的修改,并将其从保存列表中移除
git stash apply # 如果你只想应用修改但不移除它们,可以使用。
git stash drop stash@{n} # 这会从保存列表中删除指定的保存点。
git stash clear # 清空所有保存的修改
git pull
会有几种情况:没有本地修改:如果你没有对本地文件做任何修改,那么git pull会将远程仓库的最新提交拉取下来并合并到你的本地分支,不会有任何问题。
有本地修改且已提交:如果你对本地文件进行了修改并提交了这些修改,git pull会尝试将远程仓库的最新提交与本地的提交合并。在这种情况下,Git会自动处理大多数情况,但如果有冲突(即同一文件的同一部分在远程和本地都有不同的修改),Git会提示你手动解决这些冲突。
有本地修改但未提交:如果你对本地文件进行了修改但还没有提交这些修改,git pull会尝试将远程仓库的最新提交与本地的修改合并。在这种情况下,Git会自动处理大多数情况,但如果有冲突(即同一文件的同一部分在远程和本地都有不同的修改),Git会提示你手动解决这些冲突。
那如果你想查看远程仓库最新提交的版本,但不想将本地的修改合并,可以使用git stash命令将修改保存起来:
git stash
git pull
git stash pop # 可选,不想回去就不pop
这样应该会在stash pop
阶段提出合并(有冲突的话)
解决冲突后:
git add 解决冲突的文件
git commit -m "解决冲突的提交信息"
如果是只想看一下之后直接回到修改,那么
# 1. 暂存未提交的修改
git stash
# 2. 查看指定版本的代码
git checkout <commit_hash> # 替换 <commit_hash> 为你想要查看的提交哈希值
# 此时你可以查看代码,并做任何你需要的检查
# 3. 切换回原始分支
git checkout original_branch_name # 替换 original_branch_name 为你之前所在的分支名
# 4. 恢复本地未提交的修改
git stash pop
VS code
中就有源代码管理器,可以为我们提供快速的文件添加,提交,上传的图形化按钮。git
工作树,可以在VS code
中下载插件Gitlens
,提供了很多git
有关功能。mv file.txt file1.txt # 文件改名
del 文件名 # 删除文件
rmdir 文件夹名 # 删除空文件夹
rm -r # 删除非空文件夹
alias graph="git log --graph --oneline --decorate --all" # 将命令写成别名graph,建议写在git配置文件中
全文参考:一小时GIT教程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。