Git 使用
1. Git 原理
Git 工作区、暂存区和版本库概念
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库(历史区):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git 安装 安装后配置
$ git config --global user.name "你的名字"
$ git config --global user.email "你的邮箱地址"
注意 .gitconfig 所在文件夹 的权限问题
git bash 路径格式 不能使用
\
要使用/
:cd C:/Users/dell/Documents/
2. 建立远程代码库
GitHub 上先创建项目
1. Git bash命令
- 下面按照实际操作顺序罗列
$ touch README.md
$ touch .gitignore
$ git init # git 初始化 生成 .git 文件夹
$ git status
1. 添加项目到git上
$ git add .
$ git commit -am 'first commmit init project'
// 提交git -am 后面表示注释
2. 和 Gitee/Github 的远程库关联
$ git remote add origin https://github.com/JimmyYangMJ/mmall.git
// 远程提交
// 远程库的名称叫 origin
$ git branch // 查看git 分支
- 提交到 git
bash git push -u origin master
其中 -u 表示将本地的分支与远程分支建立关联,master 为主分支名称,如果您的项目使用的是其他分支,请将 master 替换成相应的分支名称。
如果失败
需要强制提交(最好不要)$ git push -u -f origin master // 提交到gitup -f 表示强制提交
错误原因 :在线上生成、编辑了README.md文件,而本地代码文件中不包含它,所以线上线下就对不上了。
来源:https://www.cnblogs.com/bigtreei/p/10180383.html
解决: 将线上、线下代码进行合并
git pull --rebase origin dev-gaochao
然后再进行pushgit push origin master:dev-gaochao
此时 GitHub 上就可以看到更新的文件了
$ git branch -r
// 查看远程版本库分支列表
$ git branch -r
// 查看本地本库分支列表
创建新的分支
$ git checkout -b v1.0 origin/master
// 创建分支
此时本地分支已经更新,GitHub 上还没有更新
- 从 git 提交到 gitup
$ git push origin HEAD -u
将当前分支推送到gitup上
此时 可以看到 远程的 分支也更新了
- 把项目装进”冰箱“一共分三步 1. 2. 3.
会出现的问题
1. Push to origin/master was rejected的解决方法
a. 进入要上传的项目 右键-选择Git Bash Here
git pull origin master –allow-unrelated-histories
git push -u origin master -f
根据提示输入github用户名和密码登录github
• 或者 IDEA Alt+F12 :打开terminal 输入命令
来自 <https://jingyan.baidu.com/article/ab0b56304baa6ec15bfa7d5c.html>
2. Git 可视化工具
使用gitk工具
$ gitk --simplify-by-decoration --all
好好总结一下 Git
- 最详细的还是官网啦,英语好的同学这边请——https://git-scm.com/docs others:
- 菜鸟:https://www.runoob.com/git/git-workspace-index-repo.html
- 参考了:https://www.jianshu.com/p/457e4f6ed9d8
- https://www.jianshu.com/p/2e1d551b8261
- 可视化 学习 git : https://learngitbranching.js.org/?locale=zh_CN
2. 远程代码更新到本地
多台电脑上开发一个项目的时候,需要经常修改提交内容并在另一台电脑上更新远程最新的代码
参考:https://www.cnblogs.com/sxy370921/p/11734612.html
方法一,通过 git pull 拉取并自动合并
git pull <远程库名> <远程分支名>:<本地分支名>
git pull 命令等同于先做了git fetch ,再做了git merge。即:
方法二,
- 从远程获取最新版本到本地
git fetch origin master:temp
如果你当前本地分支在temp2上,你需要fetch远程分支 temp, 你运行了
git fetch origin temp:temp2
会报错:
fatal: Refusing to fetch into current branch refs/heads/temp2 of non-bare repository
原因是:不能将的远程分支 fetch 到你现在所在的 本地分支,你需要将远程分支 fetch 除了本地分支之外的其他分支上
- 比较本地仓库与下载的temp分支
git diff temp
- 合并temp分支到本地的master分支
git merge temp
- 删除temp分支
如果temp分支不想要保留,可以使用如下命令删除该分支:
git branch -d temp
(如果该分支的代码之前没有merge到本地,那么删除该分支会报错,可以使用git branch -D temp强制删除该分支。)
常见命令
Git add
git add .
IDEA目录: 红----绿
git add .
不加参数默认为将修改操作的文件和未跟踪新添加的文件添加到git系统的暂存区,注意不包括删除git add -u .
-u 表示将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增加的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库之后这个文件就会从git系统中消失了。git add -A .
-A 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区。
git commit
git commit 主要是将暂存区里的改动给提交到本地的版本库。每次使用git commit 命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id,
commit-id 在版本回退的时候是非常有用的,它相当于一个快照,可以在未来的任何时候通过与git reset的组合命令回到这里.
git commit
IDEA目录: 绿----白
git commit -m ‘message’
-m 参数表示可以直接输入后面的“message”,如果不加 -m参数,那么是不能直接输入message的,而是会调用一个编辑器一般是vim来让你输入这个message,
message即是我们用来简要说明这次提交的语句。
《这个命令不能 提交 Untracked files,需要先 git add xxx 》git commit -am ‘message’
-am等同于-a -m
-a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,
注意: 新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。
git push
在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构。
git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名。第一个master是本地分支名,第二个master是远程分支名。
git push origin master
如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建- git push origin :refs/for/master
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin –delete master git push origin
如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支git push
如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
关于 refs/for:
refs/for 的意义在于我们提交代码到服务器之后是需要经过code review 之后才能进行merge的,而refs/heads 不需要
git-stash
git stash
会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录
git stash save "test-cmd-stash"
加一个message,用于记录版本
git stash pop
命令恢复之前缓存的工作目录, 指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。
git stash apply
命令,将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝。
git stash list
查看现有stash
git stash drop
移除stash
https://www.cnblogs.com/tocy/p/git-stash-reference.html
Git push 不同仓库
git remote
你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
要查看远程库的信息,用git remote:
$ git remote
origin
或者,用git remote -v显示更详细的信息:
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。
git checkout 和 git reset 的区别
https://blog.csdn.net/longintchar/article/details/82314102
git-查看历史版本及回滚版本
git log
- 查看历史提交版本:log
1.git log 查看历史所有版本信息
2.git log -x 查看最新的x个版本信息
3.git log -x filename查看某个文件filename最新的x个版本信息(需要进入该文件所在目录)
4.git log --pretty=oneline查看历史所有版本信息,只包含版本号和记录描述
git reset
- 回滚版本:reset
1.git reset --hard HEAD^,回滚到上个版本
2.git reset --hard HEAD^~2,回滚到前两个版本
3.git reset --hard xxx(版本号或版本号前几位),回滚到指定版本号,如果是版本号前几位,git会自动寻找匹配的版本号
4.git reset --hard xxx(版本号或版本号前几位) filename,回滚某个文件到指定版本号(需要进入该文件所在目录)
git reset --soft
// 回退到指定commit,该commit之后的提交内容,保留工作目录,并把重置 HEAD 所带来的新的差异放进暂存区
git reset --hard
// 回退到指定commit,该commit之后的提交内容,工作区和暂存区的内容都被抹掉
git reset
或 git reset --mixed // 不带参数,或带参数–mixed(默认参数),与git reset --soft 不同,它将会把差异放到工作区
Git的版本和分支管理
https://blog.csdn.net/xiahouzuoxin/article/details/23140727
IDEA terminal 使用 Git
idea Terminal框想要使用git命令
把gitbash替换掉idea的默认的终端(cmd)
settings—>tools—>Terminal中的shell path 填上 :D:\Program Files\Git\bin\Git bash.exe ------>你本地的git启动地址
参考:https://www.cnblogs.com/eastwjn/p/10073202.html