本地工作目录、暂存区、本地仓库和远程仓库
- workspace工作区:本地项目地址
- index/stage暂存区:
git add .
将工作区内容加入到了暂存区 - repository本地仓库:在本地存储多个版本的文件,也称为版本库。其中有一个head指针指向最新放入仓库的文件版本,
git commit -m "描述你的提交"
将暂存区的内容提交到本地仓库 - remote远程仓库:托管代码的服务器上保存的文件,
git push origin main
将本地仓库的内容提交到远程仓库
在github上创建一个远程仓库
在github上选择“New repository”,填写以下信息:Repository name(仓库名称)、Description(描述)、Public or Private(公开或私有)、是否初始化仓库(创建 README 文件、添加 .gitignore 文件、选择许可证等),填写完信息后,点击绿色的 “Create repository” 按钮,就会创建你的远程仓库。
克隆一个已有远程仓库到本地+在此基础上做修改后再上传远程
- 可以通过点击仓库页面上的 “Code” 按钮获取仓库的 URL。
- 使用git并切换到你想要存储仓库的目录
- 如果是在已有仓库基础上进行修改,先clone远程仓库内容(无需执行git init命令),此时自动完成了本地和远程的状态同步,直接指定所需文件进行上传即可。
git clone <远程仓库链接>#默认 克隆master`
git clone -b 分支名 <远程仓库链接>#直接克隆某分支`
git clone <版本库的网址><本地目录名>#克隆到本地的指定目录名,可以将目录名作为git clone命令的第二个参数
- 直接指定所需文件进行上传即可。
git add 文件
git commit -m 'new'
git push origin main
将本地项目提交到一个新的远程仓库
- 在github上创建一个新的远程仓库,新的远程仓库中可能会包括.readme文件
- 打开git,进入本地项目目录
- 初始化目录
git init
,完成后会在文件夹内生成一个隐藏文件夹 /.git ,该文件记录了你在当前文件目录下所有有关git的操作。 - 与远程仓库建立连接,
git remote add origin <仓库链接>
远程仓库链接 - 修改分支名以对应
git branch -M main
- 同步本地和远程状态,比如将远程的readme文件同步到本地
git pull origin main
- 添加当前目录下所有文件到 Git 的暂存区
git add .
或添加某一文件到Git 的暂存区git add xxx.py
- 提交到本地仓库并做标注
git commit -m "描述你的提交"
- 提交到远程
git push origin main
(如果是第一次推送到远程仓库,可能会要求你提供 GitHub 账号的用户名和密码或个人访问令牌(Personal Access Token)作为身份验证)
第6步中,同步本地和远程的重要性,示例如下。
我在本地创建了.txt文件,并在github上新建了一个新仓库,将本地文件上传到github中
然后在github上修改了这个文档,并commit了> 然后在本地也修改了这个文档:
这时候本地再push,就会报错:
然后在命令行拉取github进行同步会报错:git pull origin main:main
修改拉取命令:git pull origin main
PS:当你运行git pull origin
命令并且合并操作遇到冲突时,Git 会将你的分支状态从
(main)
变更为
(main|MERGING)
。这是 Git 用于指示当前分支正在进行合并操作,但合并操作尚未完成的一种状态。在这种情况下,Git 会将冲突文件标记为冲突状态,并将分支状态更新为
(main|MERGING)
,以指示合并操作正在进行中。你需要手动解决冲突,并提交解决方案,然后 Git 才会将分支状态恢复为正常状态。一旦你解决了所有的冲突并完成了提交,Git 将合并操作完成,分支状态将再次变回
(main)
。
此时打开本地的.txt文件,可以看到:
在本地文件上保存github的修改,删去本地的修改(<<<<<<< HEAD 到 ======= 是本地分支的更改,======= 到 >>>>>>> branch_name 是远程分支的更改,除了删除 Git 添加的冲突标记(<<<<<<<、=======、>>>>>>>)还可以增加其他额外的内容),保存文件:
命令行再次输入:1.git add . 2.git commit -m 'fix conflicts后再次commit’后,提交成功,并可以重新上传
此时,github上的内容更新为:
查看本地仓库状态
# 随时查看当前仓库的状态
git status
# git 命令时带上目录,比如git status ./build 只查看build目录下的代码状态
git status ./build
# 查看进程
git --all
克隆git clone
# 从远程主机克隆一个版本库,默认克隆master
git clone <版本库的网址># 直接克隆某分支
git clone -b <分支名><版本库的网址># 该命令会在本地主机生成一个目录,与远程主机的版本库同名。如果要指定不同的目录名,可以将目录名作为git clone命令的第二个参数。
git clone <版本库的网址><本地目录名># git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,
git clone http[s]://example.com/path/to/repo.git/
git clone ssh://example.com/path/to/repo.git/
git clone git://example.com/path/to/repo.git/
git clone /opt/git/project.git
git clone file:///opt/git/project.git
git clone ftp[s]://example.com/path/to/repo.git/
git clone rsync://example.com/path/to/repo.git/# SSH协议还有另一种写法。
git clone [user@]example.com:path/to/repo.git/
git add.
# 添加所有的修改到 staged area
git add -A
# 添加 untracked file 和 tracked file 文件的修改到缓存区,注意会忽略掉文件的删除操作,比如你删除了文件Android.mk,执行这个命令并不会把把删除操作提交到 staged area。
git add .# 添加 tracked file 的修改到缓存区,注意会忽略掉 untracked file,也就是新增的文件。比如编译过程中产生了很多新的中间文件,使用此命令可以忽略掉这些中间文件
git add -u
远程主机git remote
为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。
不带选项的时候,git remote命令列出所有远程主机。
使用-v选项,可以参看远程主机的网址。
# 参看远程主机的网址
git remote -v
# 克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。
git clone -o yourname
# git remote show命令加上主机名,可以查看该主机的详细信息
git remote show <主机名># 添加远程主机
git remote add <主机名><网址># 删除远程主机
git remote rm <主机名># 设置远程仓库origin的新地址
git remote set-url origin <新URL># 给远程主机改名
git remote rename <原主机名><新主机名># 将本地仓库和远程仓库连接起来
git remote add origin <远程仓库地址>
拉取git fetch
一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。
# 将某个远程主机所有分支(branch)的更新,全部取回本地
git fetch <远程主机名># 只取回特定分支的更新
git fetch <远程主机名><分支名># 所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master,就要用origin/master读取。# 取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。
git checkout -b newBrach origin/master
# 在本地当前分支上合并远程分支
git merge origin/master # 或 git rebase origin/master
拉取git pull
(在已经连接远程仓库后)git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。
# 取回<远程主机名>的<远程分支名>分支,与本地的<本地分支名>合并
git pull <远程主机名><远程分支名>:<本地分支名># 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull <远程主机名><远程分支名># 等价于先git fetch origin master 再git merge origin/master
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。
# Git也允许手动建立追踪关系,指定master分支追踪origin/next分支
git branch --set-upstream master origin/master
# 如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名
git pull origin
# 如果当前分支只有一个远程追踪分支,连远程主机名都可以省略。
git pull
# 如果合并需要采用rebase模式,可以使用–rebase选项
git pull --rebase <远程主机名><远程分支名>:<本地分支名>
推送git push
git push命令用于将本地分支的更新,推送到远程主机。
# 将本地分支推送到远程分支
git push <远程主机名><本地分支名>:<远程分支名># 如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push origin master
# 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
git push origin :master # 等同于 git push origin --delete master# 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
# 如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支
git push origin test:master # 提交本地test分支作为远程的master分支# 不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
git push --all origin
# 如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用–force选项, 结果导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge)。除非你很确定要这样做,否则应该尽量避免使用–force选项。
git push --force origin
查看、重命名、切换、删除分支git branch
# 修改为main
git branch -M main
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
# 创建本地分支
git branch <name># 切换分支
git checkout <name># 创建本地分支并切换到分支zl_optimize
git checkout -b <name># 在某次取回的更新的基础上创建本地分支并切换到分支zl_optimize
git checkout -b newBrach origin/master
# 合并某分支到当前分支
git merge <name># 创建远程分支zl_optimize,就是把本地创建分支提交到远程仓库
git push origin zl_optimize
# 删除本地分支
git branch -d <name># 删除远程分支zl_optimize
git push origin -d <name># git push origin --delete <name>
git lag
# 查询打标分支
git tag
# 查看符合正则表达式的标签
git tag -l '[expression]'# 添加带注释的标签
git tag -a <tag name>-m <comment>
查看日志git log
# 日志输出
git log
# 只显示某个用户的提交
git log -author='kiki'# 只显示变更了的文件的名称
git log -name-only
# 查看每次提交修改的文件
git log –name-status
# 将提交信息压缩成一行显示
git log -oneline
# 显示所有提交的依赖树
git log -graph
# 按照反序显示提交记录(最旧的提交在最前面)
git log -reverse
# 显示某个日期之后的提交
git log -after
# 显示某个日期之前的提交
git log -before
# 查看某个文件的变更日志
git log -p filename
# 查看某文件(1,1)位置的变更日志
git log -L 1,1:filename
# 查看某文件中的每一行是由谁变更的
git blame filename
# 查看尚未合并到父分支的变更日志,注意–no-merges 选项意味着只显示没有合并到任何分支的变更,master..选项意味着只显示没有合并到master分支的变更(你必须在master后面加上..)。也可以使用 git show –no-merges master.. 或者 git log -p –no-merges master.. 命令(输出结果相同)来查看一下尚未合并的文件的详细变更。
git log --no-merges master..# 查看指定分支上的指定文件的内容
git show branchname:filename
# 查看指定分支上的指定文件和当前分支上的对应文件的差异
git show branchname filename
# 重新设置基线,这个命令会迫使git先将远程分支上的变更pull到本地,然后将尚未push的提交重新以这个最新版本作为基础添加进去
git pull --reabase
#
查看配置GitHub用户名、邮箱、代理、远程仓库地址
# 配置邮箱和用户名
git config --global user.name "xx"
git config --global user.email "xxx"# 查看配置信息 q退出
git config -l
# 配置代理
git config --global http.proxy http://代理地址:端口号
git config --global https.proxy http://代理地址:端口号
# 取消代理
git config --global--unset http.proxy
git config --global--unset https.proxy
# 查看当前url配置
git remote -v
# 设置远程仓库origin的新地址
git remote set-url origin 新URL
可在设置中查看代理地址与端口号
一些撤销操作
# git commit后但没push的撤销方法
git reset HEAD^# 代码保留,回到 git add 之前
git reset --hard Obfafd # 回退历史版本Obfafd,这次提交之后的变更都将被丢弃
git reset Obfafd # 回滚历史版本Obfafd,所有这次提交之后的变更都将被移到“准备提交且未暂存”状态,这意味着你必须使用git add . 和git commit把他们添加回仓库
git reset --soft Obfafd # 回滚历史版本Obfafd,所有这次提交之后的变更都将被移到“准备提交且已暂存”的状态,这意味着你仅仅只要执行git commit# 远程分支回滚方法## 本地分支版本回退
git reflog # 找到要回退的版本的commit id:(如下面找到的Obfafd)
git reset --hard Obfafd # 回退历史版本Obfafd,这次提交之后的变更都将被丢弃## 远程分支版本回退:错误提交已经推送到自己的远程分支了
git reflog # 找到要回退的版本的commit id:(如下面找到的Obfafd)
git reset --hard Obfafd # 回退版本
git push -f # 强制推送到远程分支## 公共远程分支版本回退
git revert HEAD # 撤销最近一次提交
git revert HEAD~1# 撤销上上次的提交,注意:数字从0开始
git revert 0ffaacc # 撤销0ffaacc这次提交
git clean
有时,Git会提示“untracked working tree files”会“overwritten by checkout”。造成这种情况的原因有很多。不过通常来说,我们可以使用如下命令来保持工作树的整洁,从而防止这种情况的发生:
git clean -f # remove untracked files
git clean -fd # remove untracked files/directories
git clean -nfd # list all files/directories that would be removed
团队内协作图解
跨团队协作图解
git命令速查表
版权归原作者 Kiki酱。 所有, 如有侵权,请联系我们删除。