一直在用git,但是有时候有些细节上还是会忘记需要百度。
这里对日常的一些用法做个记录,方便日后查找、
一、初始化git库
1、直接克隆
git clone git@[你的git地址]
cd gittest
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
2、已有仓库
cd existing_folder
git init
git remote add origin git@[你的git地址]
git add .
git commit -m ""
git push -u origin master
3、导入已有仓库
git clone --bare https://git.example.com/your/project.git your_path
cd your_path
git remote set-url origin git@codeup.aliyun.com:fire/shiyanshi/gittest.git
git push --mirror
二、版本回退,时光穿梭
1、提交前还原当前修改和最后一次提交,恢复到上一次commit状态
注意:此操作会不断删除最后一次提交并且回复到上一次提交,会连同当前修改和最后一次commit一起回滚,并且无限层级回滚。这个操作比较恶心。
git reset --hard HEAD^
但是如果不小心回滚错了,还是可以用git log找到id后恢复的,前提是操作窗口还没有关闭,亲测idea的提交记录使用git log看不见
git reset --hard 1094a
但是如果你第二天才想起来要回滚怎么办,这时候你也不知道commit id了
使用
git reflog
解决你的问题
再次使用
git reset --hard 9076c29
是的,刚才回滚的东西又回来了。但是回滚之前没有commit的东西却无法恢复。请谨慎此操作。
总结:git reset其实是对HEAD指针的移动,当你回退的时候其实只是指针移动到了上一次提交。
如果只是需要还原未提交的修改,只需要还原到最后一次提交的版本
git reset --hard [最后一次commitId]
或者
git reset HEAD
,如果执行了git add再执行这个命令,则无法将所有修改内容还原,只能把git add进缓存区的内容取出到工作区。
三、工作区和暂存区
git分为工作区、暂存区、master
所有需要提交到master的内容都需要先提交到暂存区
git add xxx.java
之后可以使用git status
查看xxx.java的文件状态
需要注意的是,如果使用了 git add
后再对xxx.java进行修改
之后commit
那么之后修改的内容不会被commit,只有之前被add进缓存区的内容才会commit。
撤销修改
git checkout -- readme.txt
可以丢弃工作区的修改
这里比较简单不过多描述
四、分支管理
首先我们使用命令git remote
查看到的远程分支是origin
分支推送
git push origin branch-name
如果推送失败则先使用git pull
拉取
建立本地分支和远程分支的关联
git branch --set-upstream branch-name origin/branch-name
五、缓存区
git stash
可以将当前代码暂时写入缓存区,之后做其他事情
git list
可以看到被缓存的代码
git apply
可以恢复最后一次缓存区
git apply stash@{1}
恢复指定缓存记录
恢复后stash并没有被删除
可以选择手动删除,也可以使用
git stash pop
恢复并删除
六、Rebase
git提交是按时间点递增的,如果push之前其他人先push了,那我们就需要先pull再push,这会使git的分支结构看起来很混乱。实际上我们这时候可以使用rebase
命令将我们当前分支拖动到最新的时间节点。
及将远程仓库master
上的最新push当成我们当前仓库Three
的基线
,再提交我们的代码。
结合idea的使用方式为
当前分支是Three
这个命令是将master
作为Three
的基线使用。
执行这条命令之后我们可以看到Three
分支已经包含了master
最新的代码
我们只需要再push就好。
当然rebase
的时候也会发生冲突,如果冲突内容比较复杂,建议先将rebase还原,之后再换种方式解决冲突之后再rebase
提交。
使用abort
进行rebase还原。
之后对将要合并的分支创建一个新的分支,及master
=>master-merge
之后用当前的分支去比较master-merge
,然后把差异部分手动复制到master-merge
如图:
之后再执行rebase
pull
和push
。