Friday, September 22, 2017

[git] detached Head

上 git 課程的內容,主要是說明 Detached Head 如何發生和修正

此為預設 git 線圖

[git] detach Head-1

對 Commit G 進行 git checkout,從下圖就知道,Detached Head 已經產生啦,該狀態是不在任何 branch 上的喔,應該建議應該下 git checkout -b BranchName 來建立 branch,讓該 commit 有所屬

[git] detach Head-2

假設使用者忽略上圖訊息,就直接寫 Code 且又 commit ,commit 名稱為 DetactHeadCommit

[git] detach Head-3

透過 TortoiseGit 來觀察線圖變化

[git] detach Head-4

假設在 Detacted Head 上完成,準備要切回 master 上來進行合併,切回 master 當下會有下面訊提醒,遺留一個 commit,要建立一個 branch 來保留它喔

[git] detach Head-5

利用 TortoiseGit 來觀察線圖,發現 DetactHeadCommit 不在線圖上啦

[git] detach Head-6

此時利用 git reflog 指令來找出 DetachHeadCommit 的 SHA1

[git] detach Head-7

利用 git checkout -b efa879 來讓 DetactHeadCommit 有所屬 branch

[git] detach Head-8

再利用 TotoiseGit 來顯示該 branch,就會看見 efea987 的 Parent Commit 是 Commit G 囉,DetactHeadCommit 並沒有消失不見,Code 還在

[git] detach Head-9

而 ToroiseGit 在這部分有防呆,當要 git checkout commit 時,option 內會預設要建立 branch

[git] detach Head-10

Sunday, September 10, 2017

[git] 檔案刪除衝突

7天學會Git版本控制 書籍的解說範例,以往看到的解決衝突例子,都是 Code 同行更改來說明,這次看到是檔案被刪除,就想 try 一下,在 VSTS 上刪除該檔案,在 VS 上修改該檔案並進行同步

同步會發生衝突確認

[git] 檔案刪除衝突-1

進行衝突解決判斷

[git] 檔案刪除衝突-2

書籍內容說明
  • 保留檔案,利用 git add 把檔案再加入
  • 刪除檔案,利用 git rm 把檔案移除
在 Team Explore 內,只要點選保留檔案或刪除就可以做到囉

Sunday, September 03, 2017

[git] 格式化 git log 查詢


內容中,都有介紹到格式化 git log 的設定,筆記一下
  • 原本 git log 結果
[git] 格式化 git log 查詢-1
  • 7天學會Git版本控制內容介紹
git config --global alias.lg "log --graph --decorate --pretty=oneline --abbrev-commit"
[git] 格式化 git log 查詢-2
  • SITCON Workshop - Git 版本控制入門課程介紹
git config --global alias.lg "log --color --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --"
[git] 格式化 git log 查詢-3

Tuesday, August 29, 2017

[X.Form] ListView - 更新資料

根據
的筆記,重點簡單記就是,ListView 資料來源有變更時,要透過 ObservableCollection 來通知,這樣 ListView 操作時才不會拋出 Exception

Model
namespace ListViewPractice
{
    public class XF2_Product
    {
        public string Name { get; set; }

        public override string ToString()
        {
            return Name;
        }

        public static List<XF2_Product> GetData()
        {
            return new List<XF2_Product>
            {
                new XF2_Product() { Name = "楓葉" } ,
                new XF2_Product() { Name = "樹" } ,
                new XF2_Product() { Name = "花" } ,
                new XF2_Product() { Name = "煙火" } ,
                new XF2_Product() { Name = "夜景" }
            };
        }
    }
}
ViewModel
using System.ComponentModel;
using System.Windows.Input;
using Xamarin.Forms;
// ObservableCollection 所在的 namespace
using System.Collections.ObjectModel;

namespace ListViewPractice
{
    public class XF2_ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        
         // 引發錯誤版本
        public List<XF2_Product> Source { get; set; }

        public ICommand CmdInsert
        {
            get
            {
                return new Command(() => Source.Add(new XF2_Product() { Name = "植物" }));
            }
        }

        // 可更新版本
        public ObservableCollection<XF2_Product> UpdatableSource { get; set; }

        public ICommand CmdUpdatableInsert
        {
            get
            {
                return new Command(() => UpdatableSource.Add(new XF2_Product() { Name = "植物" }));
            }
        }

        public XF2_ViewModel()
        {
            // 引發錯誤版本
            Source = XF2_Product.GetData();

            // 可更新版本
            ObservableCollection<XF2_Product> ProdList = new ObservableCollection<XF2_Product>();
            foreach (var item in XF2_Product.GetData())
            {
                ProdList.Add(item);
            }
            UpdatableSource = ProdList;
        }
    }
}

Friday, August 25, 2017

[X.Form] ListView

根據教學影片 - 用 Listview 展現集合資料 的練習,重點在於
  • ItemSource:ListView 的資料來源
  • ToString():ListView Item 內容顯示
  • SelectedItem:指定預設值
  • SeparatorVisibility 和 SeparatorColor:分隔線和分隔線顏色
Xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ListViewPractice.XF1_Basic">
    <ContentPage.Content>
        <StackLayout>
            <ListView 
                ItemsSource="{Binding ItemsSource}"
                SelectedItem="{Binding SelectedItem ,Mode=TwoWay}"
                SeparatorVisibility="Default"
                SeparatorColor="Green"/>
        </StackLayout>
    </ContentPage.Content>
</ContentPage>
ViewModel
using System.ComponentModel;

namespace ListViewPractice
{
    public class XF1_ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged(string PropertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(PropertyName));
        }

        public IList<XF1_Product> ItemsSource { get; set; }

        public XF1_ViewModel()
        {
            ItemsSource = XF1_Product.GetData();
            // 預設值為第三筆
            // SelectedItem = ItemsSource.Skip(2).FirstOrDefault();
            // 指定預設值為 "煙火"
            SelectedItem = ItemsSource.Where(w => w.Name == "煙火").FirstOrDefault();
        }

        public XF1_Product SelectedItem { get; set; }
    }
}
Model
namespace ListViewPractice
{
    public class XF1_Product
    {
        public string Name { get; set; }

        public override string ToString()
        {
            return Name;
        }

        public static List<XF1_Product> GetData()
        {
            return new List<XF1_Product>
            {
                new XF1_Product() { Name = "楓葉" } ,
                new XF1_Product() { Name = "樹" } ,
                new XF1_Product() { Name = "花" } ,
                new XF1_Product() { Name = "煙火" } ,
                new XF1_Product() { Name = "夜景" }
            };
        }
    }
}
執行結果

[X.Form] ListView