Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。
Git 各平台安装包下载地址为:http://git-scm.com/downloads
安装过程可以参考菜鸟教程:https://www.runoob.com/git/git-install-setup.html
国内访问码云速度快一点,所以使用https://gitee.com/作为远程仓库。
基本场景:
git init
初始化一个Git仓库。git add
将文件添加到暂存区。git commit
将文件提交到本地仓库。git remote add origin
命令添加远程仓库地址。git push
命令将本地仓库代码推送到远程仓库。git pull
命令可以将远程仓库的文件拉取到本地仓库。示例:
git init #初始化仓库
touch README.md #创建README.md文件
git add README.md #将README.md文件提交到暂存区
git commit -m "add README.md" #将暂存区的文件提交到本地仓库
接下来在gitee创建仓库:
仓库创建完成后,复制仓库地址:
接下来将远程仓库地址添加到Git本地仓库,然后将本地Git仓库代码推送到刚刚创建的远程仓库中。
git remote add origin https://gitee.com/L1692312138/git-demo.git #添加远程仓库
git push -u origin "master" #将本地仓库的代码推送到远程仓库
git pull #从远程仓库拉取代码
以上就是Git仓库最简单的使用场景,接下来会详细介绍一下Git命令的用法。
在使用git init
命令初始化一个仓库或者使用git clone
克隆一个仓库后,文件夹下的文件就会被Git管理。
仓库可以分四种区域
:
工作区(workspace):就是当前这个项目目录或者文件夹下的所有文件。
暂存区(stage/index): 在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index),在使用git add
命令后,文件被添加到暂存区。
本地仓库(版本库):工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库,可以当做是本地Git仓库,在使用git commit
命令后,文件被提交到版本库。
远程仓库:github、gitee等网站所提供的仓库,也可以是个人或公司搭建,使用git push
命令将本地仓库文件推送到远程仓库上。
被Git所管理的文件会有四种状态
:
Untracked: 未跟踪,文件还没有加入到git库,还没参与版本控制。
Unmodified:未更改,文件已经加入git库中,但是还没有被修改过。
Modified:已更改,文件被修改了。显示为蓝色文件。
Staged: 已暂存,在使用add命令后,文件会被添加到暂存区,显示为红色文件。
add commit push
workspace ---> staging area ----> local repository ---->remote repository
工作区 暂存区 本地仓库 远程仓库
当执行 git add
命令时,文件会被添加到暂存区。在IDEA中显示为红色文件。
当执行git commit
命令时,文件会被提交到版本库。在IDEA中显示为绿色文件。
当执行git push
命令时,文件会被推送到远程仓库中。
此外,在IDEA中,如果文件被删除,在commit提交时显示为灰色;
git clone [url]
拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。
git clone https://gitee.com/L1692312138/git-command.git # 将远程Git仓库下载到本地
git add 命令可将该文件添加到暂存区。
添加一个或多个文件到暂存区:git add [file1] [file2] ...
添加指定目录到暂存区,包括子目录:git add [dir]
添加当前目录下的所有文件到暂存区:git add .
git commit 命令将暂存区内容添加到本地仓库中。
git commit -m [message]
: message是备注信息。
git commit [file1] [file2] ... -m [message]
:可以提交指定文件到本地仓库。
git commit -am [msg]
: 表示修改后的文件,不需要执行git add命令,可以直接提交。
git status 命令用于查看在你上次提交之后是否有对文件进行再次修改。
可以使用 -s
参数来获得简短的输出结果。
git diff 命令比较文件的不同,使用--stat
参数可以显示摘要。
git diff
:可以比较工作去和暂存区文件的差异
git diff [commitID] [commitID]
:可以比较两次commit提交记录之间的不同
git diff [branchName] [branchName]
:可以比较两个分支之间的不同
git rm
命令用于删除文件。
git rm 删除文件有以下几种形式:
-f
;git rm <file>
git rm -f <file> # 强制删除
git rm --cached <file> # 把文件从暂存区域移除,但仍然保留在当前工作目录中
git rm –r <dir> # 文件夹递归删除
如果暂存区文件已经被修改,删除则需要强制删除:
git mv
命令用于移动或重命名一个文件。
git mv [file] [newfile]
git log
查看历史提交记录。
使用--oneline
选项来查看历史记录的简洁的版本。
使用--graph
选项,查看历史中什么时候出现了分支、合并。
author
参数可以查找指定用户的提交日志。
如果要指定日期,可以执行几个选项:--since
和 --before
,也可以用 --until
和 --after
,使用--no-merges
选项可以隐藏合并提交。
git log
git log --oneline
git log --graph --oneline
git log --author=LiuShihao --oneline -5
git log --oneline --before={3.weeks.ago} --after={2022-11-07} --no-merges
如果要查看指定文件的修改记录可以使用 git blame
命令
git blame <file>
git blame master.txt
git remote
命令用于在远程仓库的操作。
git remote -v #显示所有远程仓库
git remote show [remote] #显示某个远程仓库的信息
git remote add [shortname] [url]# 添加远程版本库
git push -u origin master # 将本地仓库代码推送到远程仓库
git remote rm name # 删除远程仓库
git remote rename old_name new_name # 修改仓库名
git fetch
命令用于从远程获取代码库。
git fetch origin
git merge origin/master # 如果远程仓库有更新,可以使用merge命令进行合并
git pull
命令用于从远程获取代码并合并本地的版本。
git pull
git pull origin
git pull origin master:brantest # 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
git pull origin master #如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git push
命令用于从将本地的分支版本上传到远程并合并。
如果本地版本与远程版本有差异,但又要强制推送可以使用 --force
参数:
git push origin master #将本地的 master 分支推送到 origin 主机的 master 分支
git push --force origin master # 强制推送到远程仓库
git checkout [branchName]
:表示切换分支。
git checkout --file [fileName]
:表示会用暂存区的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
git checkout HEAD
: 表示会用 HEAD 指向的 master 分支中的文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag
给它打上标签。
使用-a
选项会添加一个标签的注解,可以当做备注,推荐使用。
使用git log --decorate --oneline
命令就可以看到打的标签。
也可以给之前版本追加标签,只需要在最后加上版本号即可git tag -a v0.9 63007d5
。
可以使用git tag
命令查看所有的标签。
git tag v1.0
git tag -a v1.0
git tag -a v0.9 63007d5 # 给指定版本打标签
git log --decorate --oneline -5 #查看带标签日志
git tag # 查看所有标签
git tag -d v1.1 # 删除标签
git show v0.9 # 查看该版本修改的内容
Git有commit,为什么还要引入tag?
“请把上周一的那个版本打包发布,commit号是6a5819e…”
“一串乱七八糟的数字不好找!”
如果换一个办法:
“请把上周一的那个版本打包发布,版本号是v1.2”
“好的,按照tag v1.2查找commit就行!”
所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
使用git branch (branchname)
可以创建一个分支。
使用git branch
可以查看本地所有分支。
使用git checkout (branch)
命令切换分支。
使用git checkout -b (branchname)
:表示创建分支并立即切换到新分支。
使用git branch -d (branchname)
命令删除分支:
使用git merge
命令可以进行分支合并,示例:
首先我们创建出dev分支,切换到dev分支并修改text.txt文件,修改后commit提交。然后切换到master分之,执行git merge dev
命令,即:将dev分支合并到当前分支(master),最后我们就可以在master分支看到在dev分支修改的内容。
git checkout -b dev #创建并切换到dev分支
git commit -m "create dev branch & update text.txt" # 在dev分支修改test.txt并commit提交
git checkout master # 切换回master分支
git merge dev #将dev分支合并到master分支
git branch -d dev # 合并完成之后将dev分支删除
有关于Git的撤销与回退,一般就以下几个核心命令:
git checkout
命令将文件已修改的部分全部撤销(上次已经提交的部分不会被撤销)。git checkout
命令进行撤销,是在使用了git add 命令之后改变的内容会被撤销。git checkout 1.txt # 撤销1.txt所有修改的东西
git checkout . # 撤销当前目录所有操作
git reset HEAD --file #回退暂存区里的某个文件,回退到当前版本工作区状态
git reset –-soft 目标版本号 #可以把版本库上的提交回退到暂存区,修改记录保留
git reset –-mixed 目标版本号 #可以把版本库上的提交回退到工作区,修改记录保留
git reset –-hard #可以把版本库上的提交彻底回退,修改的记录全部revert。
git reset HEAD file #取消暂存,文件内容不变,只是文件状态改变
git checkout file #撤销修改,在使用add命令之后的内容的改变会被撤销
git log --oneline -3 # 查看版本号
git reset --hard 67f2414 #回退到67f2414版本
另外,也可以使用git rm -r --cached 1.txt
命令,将文件从本地仓库回退到工作区,停止追踪文件,文件内容不变。git log --oneline -3
git reset --hard 9c5be25
git push origin HEAD --force
git reset --hard HEAD
git reset --hard HEAD~3 # 回退上上上一个版本
git reset –-hard bae128 # 回退到某个版本回退点之前的所有信息。
git reset --hard origin/master # 将本地的状态回退到和远程的一样
注意:谨慎使用 –-hard 参数,它会删除回退点之前的所有信息。
HEAD
说明:
HEAD 表示当前版本
HEAD^ 上一个版本
HEAD^^ 上上一个版本
HEAD^^^ 上上上一个版本
可以使用 ~数字表示
HEAD~0 表示当前版本
HEAD~1 上一个版本
HEAD^2 上上一个版本
HEAD^3 上上上一个版本
git reset HEAD
命令用于取消git add 添加到暂存区的文件,内容不会改变。
如果代码已经推送到远程的话,还可以考虑revert回滚:
git log --oneline -4
git revert -n 62d6ac3
https://www.runoob.com/git/git-basic-operations.html
https://www.cnblogs.com/konglxblog/p/15216646.html