Git 使用:
基本概念
[此圖源於互聯網]
使用Git之前需要有幾個基本概念
三棵樹, 也就是根據時間線串起來的三個標籤區.
- history 是我們保存一個完整的一些列修改的地方,可以認爲是最終的倉庫.
- index 暫存區,
- workspace 實際工作路徑
一個關鍵的操作:
我的理解, 工作區中的文件如果不add(添加到index) 或者commit (從index 添加到history) ,那麼這個文件與git關係不大.也不會被版本控制管理.
Git reset
用來重置, 三種模式.
--soft
將指定 commit ID 之後的修改同時放到index和workspace中
--mixed 默認模式,
將指定commit ID之後的修改直接放到workspace中
--heard
將指定commit ID 之後的修改直接全部丟棄,在 history index 和workspace 都清空
關於用到git reset 命令的情景
1. 遠程與本地衝突
error: Your local changes to the following files would be overwritten by merge:
scripts/convert_gtf_2_genefuse.py
Please, commit your changes or stash them before you can merge.
Aborting
如下問題的時候,表明其他人和我們同時修改了一個文件,並且人家先提交到了github, 我們此時有兩種方法來解決.:
1. 保留我們自己本地的文件
git stash (將未commit的文件(其實也就是同時修改的文件)進行暫存
git pull 將遠程commit 拉倒自己的本地
git stash pop 從暫存區恢復暫存的文件
2. 保留遠程文件:
直接使用git reset --hard
git stash
git stash 是一個commit 的替代品, 一般commit 的都是一個比較完善的修改, 而stash 可以暫存而不是commit. 暫存後可以切換分支.
一般認爲 git stash 的使用情景是:
但是假設你在dev分支修改了某些文件,但這時候你不想提交(因爲你還沒改完)。注意:
如果你不先提交的話,git 切換分支時會把你未commit的文件(包括未track和已track但未放入暫存區及已放入暫存區但未commit的文件)帶到另一個分支,這時候怎麼辦呢?- 發現有一個類是多餘的,想刪掉它又擔心以後需要查看它的代碼,想保存它但又不想增加一個髒的提交。這時就可以考慮
git stash
。- 使用git的時候,我們往往使用分支(branch)解決任務切換問題,例如,我們往往會建一個自己的分支去修改和調試代碼, 如果別人或者自己發現原有的分支上有個不得不修改的bug,我們往往會把完成一半的代碼
commit
提交到本地倉庫,然後切換分支去修改bug,改好之後再切換回來。這樣的話往往log上會有大量不必要的記錄。其實如果我們不想提交完成一半或者不完善的代碼,但是卻不得不去修改一個緊急Bug,那麼使用git stash
就可以將你當前未提交到本地(和服務器)的代碼推入到Git的棧中,這時候你的工作區間和上一次提交的內容是完全一樣的,所以你可以放心的修Bug,等到修完Bug,提交到服務器上後,再使用git stash apply
將以前一半的工作應用回來。- 經常有這樣的事情發生,當你正在進行項目中某一部分的工作,裏面的東西處於一個比較雜亂的狀態,而你想轉到其他分支上進行一些工作。問題是,你不想提交進行了一半的工作,否則以後你無法回到這個工作點。解決這個問題的辦法就是
git stash
命令。儲藏(stash)可以獲取你工作目錄的中間狀態——也就是你修改過的被追蹤的文件和暫存的變更——並將它保存到一個未完結變更的堆棧中,隨時可以重新應用。
Git checkout
Git checkout 有兩種用途,
1. 恢復工作區(主要是用來從index來恢復)
通過這六步操作 我覺得git checkout -- <file>指令應該是從先從緩存區中拉取版本還原,如果沒有再到版本庫中拉取還原。在之後重新翻看廖神博客時,發現廖神在這句話的前一章對這句指令的解釋是
命令格式: git checkout -- file
2 .切換分支
命令格式: git checkout branch_name